2012-07-24 3 views
1

는 코드 세그먼트 다음에 도움이 필요 foreach 루프 대 Linq에에서 (항목) :호출하기 HashSet.Add

static void Main(string[] args) 
{ 
    var customers = new HashSet<Customer>(); 
    var action = new Action(() => 
    { 
     var innerCustomers = new Customer[] 
     { 
      new Customer { CustomerID = 1, CustomerName = "C 1" }, 
      new Customer { CustomerID = 2, CustomerName = "C 2" }, 
     }; 

     innerCustomers.Select(c => customers.Add(c)); //doesn't work 

     foreach (var customer in innerCustomers) 
      customers.Add(customer); //works fine 
    }); 

    action(); 
} 

innerCustomers.Select(c => customers.Add(c)); 그러나 "고객"모음의 레코드를 삽입하는 측면에서 작동하지 않는 것 " foreach "는 그 선 아래로 잘 작동합니다. 아무도 왜 linq에서 작동하지 않는 어떤 생각을 가지고 있습니까? 내가 선택 방법에서 무엇이든 선택하지 않는다는 것을 안다.

+0

http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

+0

Linq에이 modification-하지만 쿼리 도구가 아닙니다. –

답변

7

당신은 Select이지만 결과는 아무 것도하지 않는다. LINQ의 게으른 평가 (주문형 결과는 IEnumerable을 통해 생성되기 때문에)는 실행되지 않습니다. foreach 루프를 사용하면 가능한 가장 깨끗한 솔루션입니다.

(당신이 콜백으로하는 방법을 사용하고 싶은에 대한 정말 좋은 이유가없는 한 다른 솔루션 대신 List<Customer>를 사용하고 그에 ForEach를 호출하는 것입니다 ...하지만, 어떤 이점이 없습니다.)

편집 : 당신이하고있는 모두가 HashSet에 요소를 추가하는 경우는 사실, 가장 깨끗한 가능한 솔루션이 UnionWith입니다 :

customers.UnionWith(innerCustomers); 
+1

덕분에, 나는 완전히 게으른 로딩을 잊어 버렸습니다. :); .ToList()를 호출하자마자 컬렉션이로드되기 시작했습니다. – Moiz

+1

@MoizDhanji : 일반적으로 LINQ는 부작용이없는 _expected_입니다. 일반적으로 ToList를 호출 할 때 목록을 예상합니다. –

+0

@minitech : "UnionWith"는 방금 사용한 것입니다. 나는 브라우저에서 돌아 왔고 똑같은 것을 보았다. :) – Moiz

-1

당신은 당신이 선택을 사용하는 경우, 일을하려고하지만, 무엇 확실하지 당신은 이것을 할 수 있습니다 :

innerCustomers.Select(c => { customers.Add(c); return c; }); 
+2

minitech 언급했듯이, 게으른 로딩 때문에 작동하지 않습니다. – Moiz