Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字典中删除任何值<;字符串,列表<;字符串>&燃气轮机;使用LINQ_C#_.net_Linq - Fatal编程技术网

C# 如何从字典中删除任何值<;字符串,列表<;字符串>&燃气轮机;使用LINQ

C# 如何从字典中删除任何值<;字符串,列表<;字符串>&燃气轮机;使用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
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
重复第二次列表。