2010-07-19 33 views
2

此代码的工作,但效率不高,因为它的双查找的ignored字典。如何在LINQ语句中使用字典TryGetValue()方法使其更高效?在LINQ中使用TryGetValue()?

IDictionary<int, DateTime> records = ... 

IDictionary<int, ISet<DateTime>> ignored = ... 

var result = from r in records 
      where !ignored.ContainsKey(r.Key) || 
      !ignored[r.Key].Contains(r.Value) 
      select r; 

问题是我不知道如何在LINQ语句中声明一个变量用于out参数。

回答

1

您需要查询前申报out变量:

ISet<DateTime> s = null; 
var result = from r in records 
      where !ignored.TryGetValue(r.Key, out s) 
       || !s.Contains(r.Value) 
      select r; 

小心的副作用,如果查询不计算,直到后来,虽然...

+0

This works。我猜测,确保在变量仍在范围内时对其进行评估,并且不要尝试将其与并行LINQ结合使用。 – 2010-07-19 12:40:09

+0

@Joe,确切地说......会有不可预测的效果 – 2010-07-19 18:35:15

1

使用一个外部变量,你不必担心它走出去的范围,因为LINQ表达式是关闭将保持它活着。然而,为了避免任何冲突,你可以把变量和表达式中的函数:

public IEnumerable GetRecordQuery() { 
    ISet<DateTime> s = null; 
    return from r in records 
      ... 
} 

... 

var results = GetRecordQuery(); 

这样,只有查询访问的s变量,以及任何其他查询(从单独调用返回GetRecordQuery)会每个都有自己的变量实例。