删除与IDictionary中的条件匹配的所有项目

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)

Tim*_*ter 6

因此,您要删除密钥包含子字符串的所有条目.

您可以通过保留所有包含它的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)

如果演员阵容不起作用,则为空.