2009-03-28 2 views
2

내가 찾지 못하는 Queryable 클래스 용으로 이미 빌드 된 확장 메서드가 있다고 맹세했지만, 아마도 다른 것을 생각하고있을 수 있습니다.
모든 항목의 필드에 값을 할당하는 확장 메서드는 무엇입니까?

IQueryable<Entity> en = from e in IDB.Entities select e; 
en.ForEach(foo => foo.Status = "Complete"); 

en.Foreach() 필수 수행 할 것입니다 :

foreach(Entity foo in en){ 
    foo.Status = "Complete"; 
} 

이 이미 작성되어

나는의 라인을 따라 뭔가를 찾고 있어요? 그렇지 않은 경우 확장 메서드를 작성할 수 있습니다. LINQ 테이블과 해당 테이블의 모든 필드를 허용하는 것이 좋습니다. 시작할 수있는 좋은 곳은 어디입니까?

+0

당신이 정의한 클래스 인 Entity 클래스 란 무엇입니까? 그렇다면 상태 속성을 작성해야합니다. 맞습니까? –

+0

@gisresearch, 그가 엔티티를 만든 사실은 부적절합니다. – Samuel

답변

1

목록에 foreach가 있습니다. <>. 이 라인을 따라 대략 뭔가 :

IQueryable<Entity> en = from e in IDB.Entities select e; 
en.ToList().ForEach(foo => foo.status = "Complete"); 
+0

저기있다! 나는이 기능이 이미 여기에 있다는 의심을 품었다, 나는 단지 올바른 장소를보고 있지 않았다. List <>에 캐스팅하는 것은 완벽하게 받아 들여질 수 있으며 이것이 내가 필요한 것입니다. 감사합니다. . – drovani

2
public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) 
{ 
    foreach (var item in sequence) 
    { 
     action(item); 
    } 
} 
+0

목록에서 충돌을 피하기 위해 다른 이름을 제안합니다. 아마도 OnEach (..)? – Samuel

+0

@Samuel, 그렇지 않습니다. 두 함수 모두 똑같은 일을하기 때문에 목록에서이 버전을 쉽게 호출 할 수 없다는 사실을 염두에 두어야합니다. 이렇게하면 모든 IEnumerable'1 - List에 ForEach를 간단히 사용할 수 있습니다. –

+0

이 답변은 정말 도움이되었습니다. 내 문제의 다른 부분은 시퀀스 내 모든 항목의 작업을 수행하기 위해 내 확장 메서드를 작성하는 키워드를 아는 것이 었습니다. "Action"대표는 모든 종류의 문제에 대한 수정을 단순화하는 데 올바른 길을 지적했습니다. 감사. – drovani

5

기본 클래스 라이브러리의 어디에도 없습니다. 많은 사람들이 개발자는 자신의 공용 라이브러리에서 이것을 가지고 있지만 우리도 MoreLINQ에 있습니다.

그것은 일종의 부작용에 관한 LINQ의 정신에 어긋나지 만, 정말 유용하기 때문에 실용주의는 여기에서 교리보다 우선합니다.

한 가지주의 할 점은 예제에 쿼리 식을 사용할 필요가 없다는 것입니다. (은 전체적으로이 아니지만 값을 노출시키지 않으면 중요하지 않습니다.) 여기서는 아무 것도 유용하지 않습니다. 당신은 다만 할 수 있습니다

IDB.Entities.ForEach(foo => foo.status = "Complete"); 

을 단일 ""아니면 일반적으로 사용하는 것 "을 선택"점 표기법하고 싶은 경우에도 : 실제로 만드는 곳

IDB.Entities.Where(foo => foo.Name == "fred") 
      .ForEach(foo => foo.status = "Complete"); 

만 쿼리 표현식을 사용을 코드 간단 :

+0

매우 명확한 답변입니다. 감사합니다. 실제 쿼리 식은 훨씬 복잡합니다. 나는 질문의 단순화를 위해 그것을 줄였다. 또한 MORELinq에 대한 링크에 감사드립니다. 저기있는 많은 도움이되는 것들이 있습니다. – drovani

관련 문제