如何使用lambda表达式从字典中删除项目

Del*_*ate 31 c# lambda dictionary

我不是LINQ解决方案,

我使用简单的谓词来确定是否应该删除密钥,例如,如果字典是构造的Dictionary<int, int>,那么我应该如何删除所有带有负数据的条目

我更喜欢使用相同的字典,而不是创建新字典,我没有性能问题

有没有办法做到这一点,不使用LINQ,而是使用Lambda表达式?

我不想在LINQ中使用解决方案,因为没有人在我的项目中使用它们,不想成为第一个..但是因为我看到LINQ解决方案看起来更好,我将使用它们..

Jon*_*eet 71

最简单的方法可能是创建一个新的字典,如果这对你没问题:

var newDictionary = oldDictionary.Where(pair => pair.Value >= 0)
                                 .ToDictionary(pair => pair.Key,
                                               pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)

如果你必须改变现有的字典(例如,因为其他几个对象引用了同一个字典),你需要构建一个要删除的键列表,然后删除它们:

var toRemove = dictionary.Where(pair => pair.Value < 0)
                         .Select(pair => pair.Key)
                         .ToList();

foreach (var key in toRemove)
{
    dictionary.Remove(key);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚注意到第一句话:"我不是进入LINQ解决方案".如果这意味着您不想使用 LINQ解决方案,那么这是手动版本:

List<int> toRemove = new List<int>();
foreach (KeyValuePair<int, int> pair in dictionary)
{
    if (pair.Value < 0)
    {
        toRemove.Add(pair.Key);
    }
}

foreach (var key in toRemove)
{
    dictionary.Remove(key);
}
Run Code Online (Sandbox Code Playgroud)

...但是如果你使用LINQ,我会鼓励你这样做.我的第二个解决方案相当于"手工"版本,但更具可读性的IMO.

  • @Delashmate:如果项目中的每个人都采取这种态度,你就永远不会*使用LINQ.这里的LINQ解决方案是不是更容易理解,更具说明性?我强烈建议你拥抱LINQ - 这是一项神话般的技术.至少*与你的队友讨论. (11认同)

Kam*_*yar 9

仅使用lambda表达式:

foreach (var i in myDict.Where(d => (d.Value  < 0 || d.key <0)).ToList() ) 
{
  myDict.Remove(i.Key);
}
Run Code Online (Sandbox Code Playgroud)

  • `ToList()` 方法创建一个克隆,因此您可以迭代一个克隆并从原始字典中删除 (2认同)

the*_*oop 5

var toRemove = dict.Keys.Where(predicate).ToArray();
foreach (var key in toRemove) {
    dict.Remove(key);
}
Run Code Online (Sandbox Code Playgroud)

  • @mikel:数组的大小必须“完全”正确。通常构建“大”集合的方法是每次需要时将缓冲区大小加倍。这对于一个列表来说效果很好,你可以在之后使用超大的缓冲区 - 但如果你之后需要一个数组,你通常需要将缓冲区中的所有数据复制到一个大小正好合适的*新*数组中。请参阅 http://msmvps.com/blogs/jon_skeet/archive/2011/01/02/reimplementing-linq-to-objects-part-24-toarray.aspx 了解 ToArray 的大致功能。 (7认同)