2011-08-24 5 views
0

동안 작업을 수행 :내가 이런 컬렉션이 열거

(from query in queries 
where _metadata.ContainsKey(query.Value) 
select query).ToList().ForEach(result=>_metadata[result.Value].AddQuery(result)); 

쿼리 열거와 일치하는 AddQuery()를 호출하여 더 간단하게 만들 수 있을지 궁금합니다. 쿼리는 변경할 수 없으므로 중단해서는 안됩니다. 다음과 같은 내용이어야합니다. 당신은 , 어디 등 부작용이있는 선택하는 람다를 제공 할 수 있습니다

foreach (var query = queries.Where(q => _metadata.ContainsKey(query.Value))) 
{ 
    _metadata[query.Value].AddQuery(query) 
} 

-하지만 일반적으로 좋은 생각입니다;

from query in queries 
where _metadata.ContainsKey(query.Value) 
//do something like _metadata[query.Value].AddQuery(query) 

답변

3

은 왜 그냥 할 LINQ 쿼리는 무 상태이므로 이상적으로는 쿼리를 여러 번 반복하여 문제없이 반복 할 수 있어야합니다. 여기서는 쿼리에서 부작용 (_metadata에 쿼리 추가)을 명확하게 구분했습니다. 위의 코드는 여전히 방식으로 인해 Where에,하지만 원래 약간 다르게 작동

참고 실행 - 각 새 쿼리가 추가됩니다 나머지 Where 술어가을 실행하기 전에. 즉, 쿼리 자체가 부작용이 있지만 도입하는 부작용이 쿼리에 영향을 미칩니다. 이 도움이

queries.ForEach(query=> { 
    if(_metadata.ContainsKey(query.Value)) 
      //do somethign ... 
}); 

희망 :

+0

AddQuery() 메소드는 사전의 키와는 아무 상관이 없습니다 고려. 쿼리 (사전 값) 컬렉션에 쿼리를 추가하기 만하면됩니다. 여전히 부작용이 있습니까? –

+0

@Ufuk :'AddQuery'를 호출해도'ContainsKey'에 영향을 미치지 않는다면 좋습니다. 여전히 부작용이지만 그게 당신이 원하는 * 것입니다. 중요한 것은 쿼리를 방해하지 않는 부작용입니다. –

0

는이 같은, 의사를 사용할 수 있습니다.

편집

이 목록에없는 경우, 존의 솔루션 @ => 단지 foreach 루프

+0

변수 이름이 섞여 있습니다. – Alxandr

+0

@Alxandr : 감사합니다! 수정 됨 – Tigran

+0

검색어가 목록이 아닙니다. ForEach를 호출 할 수 없습니다. 먼저 포함 된 값을 가져와야합니다. –

관련 문제