2010-07-19 3 views
2

이 코드는 작동하지만 사전 ignored을 이중 참조하기 때문에 비효율적입니다. 더 효율적으로 만들기 위해 사전 TryGetValue() 메서드를 LINQ 문에서 어떻게 사용할 수 있습니까?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; 

문제는 out 매개 변수에 사용할 LINQ 문 내에서 변수를 선언하는 방법을 모르겠다는 것입니다.

답변

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

이것은 작동합니다. 변수가 여전히 범위에있는 동안 변수를 평가하고 병렬 LINQ와 함께 사용하지 않으려 고합니다. –

+0

@Joe, 정확하게 ... 예측할 수없는 효과가 있습니다. –

1

, LINQ식이 클로저이기 때문에 범위를 벗어나는 것에 대해 걱정할 필요가 없습니다. 그러나 충돌을 방지하기 위해, 당신은 함수에서 변수와 식을 넣을 수 :

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

... 

var results = GetRecordQuery(); 

그 방법 만 쿼리는 것이다 (GetRecordQuery에 별도의 호출에서 반환)을 s 변수에 대한 액세스 및 기타 쿼리를 가지고 각각 변수의 인스턴스가 있습니다.