繁体   English   中英

如何使用linq从C#中的字典中删除值?

[英]How to delete a value from the dictionary in C# using linq?

我有像这样的字典

Dictionary<String,List<String>> MyDict=new Dictionary<String,List<String>>();

并且其中包含

{ "One"   { "A", "B", "C" } }
{ "Two"   { "C", "D", "E" } }

现在我需要删除“一个”中的“ C”

所以现在MyDict将成为

{ "One"   { "A", "B" } }
{ "Two"   { "C", "D", "E" } }

遍历Keyvalue对并​​重建Dictionary将产生所需的输出(现在我正在使用此迭代方法)

但是在LINQ中有什么方法可以做到这一点吗?

这将为每个键创建一个新字典和一个新列表,在“一个”中省略“ C”:

var result = myDict.ToDictionary(
    kvp => kvp.Key, 
    kvp => kvp.Value.Where(x => kvp.Key != "One" || x != "C").ToList());

或者,这将为“一个”创建一个新字典和一个新列表,并保留其他列表:

var result = myDict.ToDictionary(
    kvp => kvp.Key,
    kvp => (kvp.Key != "One") ? kvp.Value
                              : kvp.Value.Where(x => x != "C").ToList());

不过,就地修改字典可能更容易,更快捷:

myDict["One"].Remove("C");

LINQ在这里是一个过大的杀伤力,它很简单:

MyDict["One"].Remove("C");

LINQ(和整个功能范式)也经过特殊设计,可在不可修改的序列上运行,通常,删除某些内容会创建新的序列,在这种情况下几乎总是会产生巨大的开销,因为它完全用另一种语言模仿了功能范式。

MyDict["One"].Remove("C");

为什么要使用linq。 使用LINQ的功能之一是处理对象的不变性,所以我认为这不是您真正想要的。 使用linq进行操作要复杂得多(例如将字典作为KeyValuePair的IEnumerable然后将其构造成新的Dictionary ....),除非您正在使用此dict构造某种管道处理,否则可能不应该这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM