如何使用LINQ“修剪”字典?

时间:2009-05-06 17:10:25

标签: c# linq

我有一个词典和一个要从词典中删除的键列表。这是我现在的实施:

var keys = (from entry in etimes
            where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime)
            select entry.Key).ToList();

foreach (var key in keys)
{
    etimes.Remove(key);
    count--;
}

我能做些什么来消除foreach循环?

2 个答案:

答案 0 :(得分:6)

var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >= 
    Convert.ToInt64(stime)).ToDictionary(entry => entry.Key, 
        entry => entry.Value);

此语句只是使用LINQ Where函数过滤字典,以选择要保留的项目而不是要删除的项目(然后需要更多代码,如您所示)。 ToDictionaryIEnumerable<KeyValuePair<TKey, TValue>>转换为欲望Dictionary<TKey, TValue>类型,并且至少非常简单,如果不是非常优雅或高效,因为需要指定两个lambda表达式来选择键来自KeyValuePair的值(然后创建一个新词典)。说这个,我并不认为这是一个问题,特别是如果字典很小和/或被删除的项目数量很大。

答案 1 :(得分:0)

除了性能或可读性问题之外,还不能像下面这样做:

<Extension> void itemDelete(List l, object item) {
    l.Remove(item)
}

var keys = (from entry in etimes
        where Convert.ToInt64(entry.Value) < Convert.ToInt64(stime)
        select entry.Key).ToList();

keys.foreach(itemDelete());

原谅我的编码,我不是100%确定语法(特别是在C#中);考虑一下伪代码。 请注意在LINQ查询末尾添加新函数和 .foreach 函数。 我知道在VB中这是可能的,我认为C#有类似的东西......如果不是,你总是可以编写自己的 .foreach 扩展名。 它可能会或可能不会改善任何东西,但这是一个想法。