2009-05-06 59 views
5

我有一个词典和一个从字典中删除键的列表。这是我现在执行︰如何使用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循环?

+1

通过你并不需要.ToList()的foreach将与任何IEnumerable的 – 2009-05-06 17:28:01

+0

LINQ的工作方式是一种查询语言,它可以通过将现有的数据创建新的数据。它不能改变现有的数据。 – codymanix 2011-05-10 12:39:47

回答

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

这个语句简单过滤器使用LINQ Where功能选择哪些项目,以保持比删除(然后需要进一步的代码,因为你表现)的字典。该ToDictionary转换thwe IEnumerable<KeyValuePair<TKey, TValue>>的欲望Dictionary<TKey, TValue>类型,至少是相当简单的,如果不是非常优雅和有效的,因为需要到指定两个lambda表达式来选择从KeyValuePair键和值(,然后创建一个新的字典)。说到这一点,我并不认为这是一个问题,特别是如果字典很小和/或删除的项目数量很大。

+0

我不想评论表现的方式 - 如果你关心的话,然后测试两种方法。我不确定你使用foreach的原始解决方案会*更快*。 – Noldorin 2009-05-06 17:22:11

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扩展。 它可能会也可能不会改善任何事情,但这是一个想法。