我有一个词典和一个要从词典中删除的键列表。这是我现在的实施:
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循环?
答案 0 :(得分:6)
var pruned = etimes.Where(entry => Convert.ToInt64(entry.Value) >=
Convert.ToInt64(stime)).ToDictionary(entry => entry.Key,
entry => entry.Value);
此语句只是使用LINQ Where
函数过滤字典,以选择要保留的项目而不是要删除的项目(然后需要更多代码,如您所示)。 ToDictionary
将IEnumerable<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 扩展名。 它可能会或可能不会改善任何东西,但这是一个想法。