2012-07-11 4 views
0

을 통해 두 개의 반복을 피할 수 있습니다. SingleOrDefault()가 개체의 복사본과 함께 새로운 IEnumerable을 반환한다는 것을 이해하고 있기 때문에이 작업을 수행합니다. (나는 오해 했습니까?) 목록은 일반적으로 그리 길지 않으므로 여분의 반복은 그리 중요하지 않지만 실제로는 저를 괴롭 힙니다.내가과 같이 검색 LINQ를 사용하여 일반적인 목록을이 목록

나는 두 번의 반복을 통합하는 방법을 생각할 수 없다. 아이디어가 있으십니까?

+4

item.Read = true를 사용할 수 없습니까? – Chandu

답변

4

SingleOrDefault 대신 IEnumerable은 하나의 항목 만 반환합니다. 변수를 이미 변수 item에 할당하고 보관하고 있으므로 추가 처리를 위해 단순히 사용하지 않는 것이 어떻습니까?

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault(); 
item.Read = true; 

더 간단하게 할 수 있습니다. 팀에 의해 지적으로 그리고, 당신은 (이유는 아래 참조) 널 검사가 필요합니다

NotificationWindowItem item = itemList.SingleOrDefault(elm => elm.UID == UID); 
if (item == null) 
{ 
    // ... some alternative or error handling code 
} 
else 
{ 
    item.Read = true; 
} 

은 질문/unclarities에 확장하려면 :

  1. itemList에이 항목의 목록입니다. 각 항목은 NotificationWindowItem입니다. 이 목록은 IEnumerable 인터페이스를 구현합니다. (보다 정확하게는, I는 itemList에가 IEnumerable<NotificationWindowItem>를 구현하는 List<NotificationWindowItem>라고 가정하고있다.
  2. 가 어디 IEnumerable<NotificationWindowItem> 걸리고 만 매칭 요소를 포함하는 다른 IEnumerable<NotificationWindowItem>를 생성 확장 방법.
  3. SingleOrDefault가 IEnumerable<NotificationWindowItem> 소요 법선 반환 단순한 단일 NotificationWindowItem (그 이상의 것, 일치하는 요소가 하나만 있는지 확인합니다.) 둘 이상의 요소가 일치하면 예외를 throw합니다. 일치하는 요소가없는 경우 인 default(T)을 반환합니다.
  4. item이 아니요. a n IEnumerable. NotificationWindowItem입니다. 뒤에는 마법이 없습니다. 그것은 단순한 객체입니다. LINQ와 아무런 관련이 없습니다. LINQ 만 사용하여 검색했지만 나중에는 다른 NotificationWindowItem 인스턴스로 수행 할 수있는 모든 작업을 수행 할 수 있습니다.
+1

주어진 UID가있는 NotificationWindowItem이없는 경우에 대비하여 null 체크를 추가 할 수 있습니다. –

+0

그래서 항목이 심판에 의해 전달됩니까? 나는이 확장 메소드가 객체의 사본을 만들었다는 인상을 받고 있었다. 그럼 내가 생각했던 것보다 간단합니다 :) –

+0

@EladLachmi 그것은 아이템이 참조로 전달된다는 것이 아니라 항목 자체가 * 참조이므로 (클래스이기 때문에) 값으로 복사하는 것은 참조의 다른 복사본을 만드는 것입니다. – Servy

1

이중 루프가 필요하지 않습니다. 당신이 사용할 수

var item = itemList.SingleOrDefault(elm => elm.UID == UID); 
item.Read = true; 
0

,

NotificationWindowItem item = itemList.Where(elm => elm.UID == UID).SingleOrDefault().toList(); 

이 문제를 해결하기 위해.

관련 문제