使用Linq从C#中的字典中删除具有相同值数据的多个键

时间:2018-05-07 21:05:30

标签: c# linq dictionary

我知道必须有更好的方法来做到这一点......也许是LINQ?如果我删除一个值,它会使迭代器无效,这就是为什么我在无限循环内部重新启动进程的原因。我正在寻找一种更容易阅读,维护并最终更快的方法。这就是我得到的:

Dictionary<string, string> Channels = //...;
while (true)
{
    var bFound = false;
    foreach(var c in Channels)
    {
        if(c.Value == version)
        {
            Channels.Remove(c.Key);
            bFound = true;
            break;
        }
    }
    if (!bFound) { break; }
}

感谢您在优化此例程方面的任何帮助。

3 个答案:

答案 0 :(得分:6)

根据您的示例,您将根据与版本值的比较来删除。

Channels = Channels.Where(x=> x.Value != version)
              .ToDictionary(c => c.Key, c => c.Value);

答案 1 :(得分:3)

  

我正在寻找一种更容易阅读,维护并最终更快的方法

只需使用以下代码:

var keys = Channels.Keys.ToArray();
foreach(var key in keys)
{
    if(Channels[key] == version)
    {
        Channels.Remove(key);
    }
}

简化不需要LINQ。为了表现,我们遍历字典一次。

答案 2 :(得分:2)

如果您在从字典中删除项目之前捕获匹配项,则您的枚举器将不会失效。

List<KeyValuePair<string, string>> matches = Channels
  .Where(kvp => kvp.Value == version)
  .ToList();

foreach(KeyValuePair<string, string> match in matches)
{
  Channels.Remove(match.Key);
}