我有一个像
这样的词典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中做到这一点吗?
答案 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构建某种管道处理,否则我不应该这样做。