rbo*_*boy 4 c# idictionary match
我正在尝试删除符合条件的IDictionary对象中的所有元素.
例如,IDictionary包含一组键和相应的值(比如说80个对象).键是字符串,值可以是不同类型(想想使用directshow从wtv文件中提取元数据).
一些键包含文本"thumb",例如thumbsize,startthumbdate等.我想删除IDictionary中包含单词thumb的所有对象.
我在这里看到的唯一方法是使用.Remove方法手动指定每个键名.
有没有办法让所有对象包含单词thumb的对象,并将它们从IDictionary对象中删除.
代码如下所示:
IDictionary sourceAttrs = editor.GetAttributes();
Run Code Online (Sandbox Code Playgroud)
GetAttributes定义为:
public abstract IDictionary GetAttributes();
Run Code Online (Sandbox Code Playgroud)
我无法控制GetAttributes,它返回一个IDictionary对象,我只是通过在调试时查看它来了解内容.(可能是HashTable)
更新:感谢Tim的最终答案:
sourceAttrs = sourceAttrs.Keys.Cast<string>()
.Where(key => key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1)
.ToDictionary(key => key, key => sourceAttrs[key]);
Run Code Online (Sandbox Code Playgroud)
因此,您要删除密钥包含子字符串的所有条目.
您可以通过保留所有不包含它的LINQ来使用它:
dict = dict
.Where(kv => !kv.Key.Contains("thumb"))
.ToDictionary(kv => kv.Key, kv => kv.Value);
Run Code Online (Sandbox Code Playgroud)
如果您想要不区分大小写的比较,您可以使用IndexOf:
dict = dict
.Where(kv => kv.Key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1)
.ToDictionary(kv => kv.Key, kv => kv.Value);
Run Code Online (Sandbox Code Playgroud)
根据您的非通用编辑进行更新:
如果它是一个非泛型字典,HashTable你不能直接使用LINQ,但如果你知道密钥是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]);
Run Code Online (Sandbox Code Playgroud)
但也许它实际上是一个通用的Dictionary,你可以尝试使用as运算符:
var dict = sourceAttrs as Dictionary<string, object>;
Run Code Online (Sandbox Code Playgroud)
如果演员阵容不起作用,则为空.