gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:52:04 25 4
gpt4 key购买 nike

我正在尝试删除 IDictionary 对象中与条件匹配的所有元素。

例如IDictionary 包含一组键和相应的值(比方说 80 个对象)。键是字符串,值可以是不同类型(考虑使用 directshow 从 wtv 文件中提取元数据)。

有些键包含文本“thumb”,例如thumbsize, startthumbdate 等我想从 IDictionary 中删除键包含单词 thumb 的所有对象。

我在这里看到的唯一方法是使用 .Remove 方法手动指定每个键名。

有没有办法让所有的对象的键都包含单词 thumb 并将它们从 IDictionary 对象中删除。

代码如下所示:

IDictionary sourceAttrs = editor.GetAttributes();

GetAttributes 定义为:

public abstract IDictionary GetAttributes();

我无法控制 GetAttributes,它返回一个 IDictionary 对象,我只能在调试时通过查看它来了解内容。 (可能是哈希表)

更新:感谢 Tim 的最终回答:

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);

根据您的非通用编辑更新:

如果它是像 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]);

但也许它实际上是一个通用的 Dictionary,您可以尝试使用 as 运算符进行转换:

var dict = sourceAttrs as Dictionary<string, object>;

如果转换无效则为 null。

关于c# - 删除与 IDictionary 中的条件匹配的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com