如何从Dictionary <string,list <string>&gt;中删除任何值使用LINQ </string,list <string>

时间:2014-12-17 11:00:51

标签: c# .net linq

我有一个字典Dictionary<string,List<string>>我想使用Linq语句从List中删除任何项目。这是我的代码

 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" });

我想从任何键上的字典中删除项目's'。以下代码对我来说很好。

foreach (KeyValuePair<string,List<string>> kvp in dic1)
{
    if (kvp.Value.Contains("ss"))
    {
        kvp.Value.Remove("ss");
    }
}

有没有可能在这里使用Linq语句?感谢....

4 个答案:

答案 0 :(得分:5)

当项目不存在时,

List.Remove不会失败(它返回bool告诉它是否成功)所以没有理由事先检查。只需删除它。 此外,由于您不关心密钥,因此您可以只迭代值(在您的情况下为列表):

foreach (var list in dic1.Values)
{
    list.Remove("ss");
}

由于LINQ用于查询数据并且您没有查询,因此没有理由在此使用LINQ。您只需要删除这些项目。

答案 1 :(得分:0)

 foreach (KeyValuePair<string, List<string>> kvp in dic1.Where(kvp => kvp.Value.Contains("ss")))
        {
            kvp.Value.Remove("ss");
        }

答案 2 :(得分:0)

在评论中有一个答案,我想推广为对该问题的有效答案。

在我的情况下,我定义了一个词典:

   Dictionary<string, List<string>> selections = new Dictionary<string, List<string>>();

然后,我根据用户可编辑的多行文本框将数据添加到字典中。如果用户编辑该字段,我不想允许使用空行,因为我使用\ r \ n分割行时,以后会给我错误的条目计数。

        selections.Add("States", txtStates.Text.Replace("\n", "").Split('\r').ToList());
        selections.Add("Zones", txtZones.Text.Replace("\n", "").Split('\r').ToList()); 
        selections.Add("ZipCodes", txtZipCodes.Text.Replace("\n", "").Split('\r').ToList());

通过使用这一行代码,我可以删除所有不包含数据的元素:

        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();

总体而言,我发现删除语句是一个非常优雅的解决方案。

答案 3 :(得分:-1)

var newdic = new Dictionary<string, List<string>>();
dic1.ToList().ForEach
(
   pair =>
   {
      newdic.Add(pair.Key, pair.Value.Where(x => x!="ss").ToList());
   }
);