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

时间:2010-11-03 10:30:18

标签: c# linq dictionary

我有一个像

这样的词典
Dictionary<String,List<String>> MyDict=new Dictionary<String,List<String>>();

,其中包含

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

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

所以现在MyDict将成为

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

迭代Keyvalue对并​​重建Dictionary会产生所需的输出(现在我正在使用这种迭代方法)

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

3 个答案:

答案 0 :(得分:3)

这会为每个键创建一个新词典和一个新列表,省略“One”中的“C”:

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

或者,这会为“One”创建一个新词典和一个新列表,保留其他列表:

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

虽然可以更容易,更快速地修改字典:

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

答案 1 :(得分:2)

LINQ在这里太过分了,它很简单:

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

LINQ(和整个功能范例)专门设计用于操作不可修改的序列,删除某些东西通常是新序列的创建,在这种情况下几乎总是会导致巨大的开销,因为它在另一种语言中模仿功能范例

答案 2 :(得分:0)

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

为什么要使用linq?使用LINQ时的一个特性是处理对象的不变性,所以我认为这不是你真正想要的。使用linq更加复杂(比如将字典视为KeyValuePair的IEnumerable然后构建它的新词典......)除非你使用这个dict构建某种管道处理,否则我不应该这样做。