我正在尝试删除IDictionary对象中与条件匹配的所有元素。
例如,IDictionary包含一组键和相应的值(假设有80个对象)。键是字符串,值可以是不同的类型(请考虑使用DirectShow从wtv文件中提取元数据)。
一些键包含文本“ thumb”,例如thumbsize,startthumbdate等。我想从IDictionary中删除所有包含键thumb的对象。
我在这里看到的唯一方法是使用.Remove方法手动指定每个键名称。
是否有某种方法可以使键的所有对象包含thumb并将它们从IDictionary对象中删除。
代码如下:
IDictionary sourceAttrs = editor.GetAttributes();
GetAttributes定义为:
public abstract IDictionary GetAttributes();
我没有对GetAttributes的控制,它返回一个IDictionary对象,我只能在调试时通过查看它来了解内容。(可能是HashTable)
更新:最后的答案感谢蒂姆:
sourceAttrs = sourceAttrs.Keys.Cast<string>()
.Where(key => key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1)
.ToDictionary(key => key, key => sourceAttrs[key]);
因此,您要删除键包含一个子字符串的所有条目。
您可以通过保留所有不包含它的方式来使用LINQ :
dict = dict
.Where(kv => !kv.Key.Contains("thumb"))
.ToDictionary(kv => kv.Key, kv => kv.Value);
如果要进行不区分大小写的比较,可以使用IndexOf
:
dict = dict
.Where(kv => kv.Key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1)
.ToDictionary(kv => kv.Key, kv => kv.Value);
根据您的非常规编辑进行更新:
如果它是像a这样的非通用字典HashTable
,则不能直接使用LINQ,但是如果知道键是a string
,则可以使用以下查询:
// sample IDictionary with an old Hashtable
System.Collections.IDictionary sourceAttrs = new System.Collections.Hashtable
{
{"athumB", "foo1"},
{"other", "foo2"}
};
Dictionary<string, object> newGenericDict = sourceAttrs.Keys.Cast<string>()
.Where(key => !key.Contains("thumb"))
.ToDictionary(key => key, key => sourceAttrs[key]);
但是实际上它可能是通用的Dictionary
,您可以尝试与as
运算符进行转换:
var dict = sourceAttrs as Dictionary<string, object>;
如果强制转换无效,则为null。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句