C# 如何从字典中删除任何值<;字符串,列表<;字符串>&燃气轮机;使用LINQ
我有一个dictionaryC# 如何从字典中删除任何值<;字符串,列表<;字符串>&燃气轮机;使用LINQ,c#,.net,linq,C#,.net,Linq,我有一个dictionarydictionary我想使用Linq语句从列表中删除任何项。这是我的密码 Dictionary<string, List<string>> dic1 = new Dictionary<string, List<string>>(); dic1.Add("K1", new List<string>() { "ss", "ss1" }); dic1.Add("K2", new List<string
dictionary
我想使用Linq语句从列表中删除任何项。这是我的密码
Dictionary<string, List<string>> dic1 = new Dictionary<string, List<string>>();
dic1.Add("K1", new List<string>() { "ss", "ss1" });
dic1.Add("K2", new List<string>() { "ss2", "ss3" });
Dictionary dic1=新字典();
添加(“K1”,新列表(){“ss”,“ss1”});
添加(“K2”,新列表(){“ss2”,“ss3”});
我想从此字典中删除任何键上存在的项“ss”。下面的代码对我来说运行良好
foreach (KeyValuePair<string,List<string>> kvp in dic1)
{
if (kvp.Value.Contains("ss"))
{
kvp.Value.Remove("ss");
}
}
foreach(dic1中的KeyValuePair kvp)
{
if(kvp.Value.Contains(“ss”))
{
kvp.值。移除(“ss”);
}
}
这里有没有可能使用Linq语句??谢谢….
列表。当项目不存在时,删除不会失败(它返回一个bool
告诉它是否成功),因此没有理由事先检查。只需将其移除即可。
此外,由于您不关心键,因此可以只迭代值(在您的示例中列出):
这里没有理由使用LINQ,因为LINQ用于查询数据,而您没有查询。您只需删除项目。列表。当项目不存在时,删除不会失败(它返回一个bool
告诉它是否成功),因此没有理由事先检查。只需将其移除即可。
foreach (KeyValuePair<string, List<string>> kvp in dic1.Where(kvp => kvp.Value.Contains("ss")))
{
kvp.Value.Remove("ss");
}
此外,由于您不关心键,因此可以只迭代值(在您的示例中列出):
这里没有理由使用LINQ,因为LINQ用于查询数据,而您没有查询。您只需要删除这些项。foreach(dic1.Where(kvp=>kvp.Value.Contains(“ss”))中的KeyValuePair kvp)
foreach (KeyValuePair<string, List<string>> kvp in dic1.Where(kvp => kvp.Value.Contains("ss")))
{
kvp.Value.Remove("ss");
}
{
kvp.值。移除(“ss”);
}
foreach(dic1.Where中的键值对kvp(kvp=>kvp.Value.Contains(“ss”))
{
kvp.值。移除(“ss”);
}
var newdic=newdictionary();
dic1.ToList().ForEach
(
配对=>
{
newdic.Add(pair.Key,pair.Value.Where(x=>x!=“ss”).ToList();
}
);
var newdic=newdictionary();
dic1.ToList().ForEach
(
配对=>
{
newdic.Add(pair.Key,pair.Value.Where(x=>x!=“ss”).ToList();
}
);
在一条评论中有一个答案,我想将其提升为这个问题的有效答案
就我的情况而言,我有一本字典的定义如下:
Dictionary<string, List<string>> selections = new Dictionary<string, List<string>>();
通过使用这行代码我可以删除所有不包含数据的元素:
selections.Values.LastOrDefault(li => { li.Remove(""); return false; });
因此,稍后我可以从文本框中获得元素的准确计数
var Icnt = selections.Where(r => r.Key == "Items").SelectMany(r => r.Value).Count();
var Scnt = selections.Where(r => r.Key == "States").SelectMany(r => r.Value).Count();
var Zcnt = selections.Where(r => r.Key == "Zones").SelectMany(r => r.Value).Count();
var ZCcnt = selections.Where(r => r.Key == "ZipCodes").SelectMany(r => r.Value).Count();
总的来说,我发现删除声明是一个非常优雅的解决方案。在一条评论中有一个答案,我想将其提升为这个问题的有效答案
就我的情况而言,我有一本字典的定义如下:
Dictionary<string, List<string>> selections = new Dictionary<string, List<string>>();
通过使用这行代码我可以删除所有不包含数据的元素:
selections.Values.LastOrDefault(li => { li.Remove(""); return false; });
因此,稍后我可以从文本框中获得元素的准确计数
var Icnt = selections.Where(r => r.Key == "Items").SelectMany(r => r.Value).Count();
var Scnt = selections.Where(r => r.Key == "States").SelectMany(r => r.Value).Count();
var Zcnt = selections.Where(r => r.Key == "Zones").SelectMany(r => r.Value).Count();
var ZCcnt = selections.Where(r => r.Key == "ZipCodes").SelectMany(r => r.Value).Count();
总的来说,我发现删除语句是一个非常优雅的解决方案。列表可以包含几个匹配的项吗?在这种情况下,您可以使用list.RemoveAll(s=>s==“ss”)
No,它只包含唯一的值。在这种情况下,我也不知道键是什么。如果每个键的列表很长,用哈希集
或排序集
替换它可能会提高性能。Linq没有ForEach
扩展,这不是Linq设计的目的。因此,请坚持使用foreach
语句。当然,您可以强制Linq产生副作用,例如dic1.Values.LastOrDefault(li=>{li.Remove(“ss”);return false;})代码>将起作用。但是没有人建议这样做。一个列表可以包含几个匹配的项目吗?在这种情况下,您可以使用list.RemoveAll(s=>s==“ss”)
No,它只包含唯一的值。在这种情况下,我也不知道键是什么。如果每个键的列表很长,用哈希集
或排序集
替换它可能会提高性能。Linq没有ForEach
扩展,这不是Linq设计的目的。因此,请坚持使用foreach
语句。当然,您可以强制Linq产生副作用,例如dic1.Values.LastOrDefault(li=>{li.Remove(“ss”);return false;})代码>将起作用。但没有人建议这样做。@Adamhuldsworth这不仅毫无意义,而且是一种糟糕的风格。不要将LINQ与副作用混为一谈。这也更有效,因为它消除了对Contains
重复列表一次,对Remove
@AdamHouldsworth重复列表第二次的情况。这不仅毫无意义,而且是一种糟糕的风格。不要将LINQ与副作用混用。这也更有效,因为它消除了对Contains
重复一次列表,对Remove
重复第二次列表。