LINQ를 사용하여 다음을 수행하는 방법이 있습니까?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
명확히하기 위해 컬렉션의 각 개체를 반복 한 다음 각 개체의 속성을 업데이트하고 싶습니다.
내 유스 케이스는 블로그 게시물에 대한 의견이 많으며 블로그 게시물의 각 의견을 반복하고 블로그 게시물의 날짜 시간을 +10 시간으로 설정하고 싶습니다. SQL로 할 수는 있지만 비즈니스 계층에 유지하고 싶습니다.
답변
당신이 사용할 수 있지만 ForEach
확장 방법을, 당신은 당신이 할 수있는 단지 프레임 워크를 사용하려는 경우
collection.Select(c => {c.PropertyToSet = value; return c;}).ToList();
게으른 평가ToList
로 인해 선택을 즉시 평가하려면 이 옵션 이 필요합니다 .
답변
collection.ToList().ForEach(c => c.PropertyToSet = value);
답변
나는 이것을하고있다
Collection.All(c => { c.needsChange = value; return true; });
답변
실제로 내가 원하는 것을 할 수있는 확장 방법 을 찾았습니다.
public static IEnumerable<T> ForEach<T>(
this IEnumerable<T> source,
Action<T> act)
{
foreach (T element in source) act(element);
return source;
}
답변
사용하다:
ListOfStuff.Where(w => w.Thing == value).ToList().ForEach(f => f.OtherThing = vauleForNewOtherThing);
이것이 LINQ를 과도하게 사용하고 있는지 확실하지 않지만 특정 조건에 대해 목록의 특정 항목을 업데이트하려고 할 때 효과적이었습니다.
답변
이를위한 내장 확장 방법은 없습니다. 하나를 정의하는 것은 상당히 간단합니다. 게시물 맨 아래에는 Iterate라는 정의 된 방법이 있습니다. 그렇게 사용할 수 있습니다
collection.Iterate(c => { c.PropertyToSet = value;} );
반복 소스
public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T> callback)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}
IterateHelper(enumerable, (x, i) => callback(x));
}
public static void Iterate<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
if (enumerable == null)
{
throw new ArgumentNullException("enumerable");
}
IterateHelper(enumerable, callback);
}
private static void IterateHelper<T>(this IEnumerable<T> enumerable, Action<T,int> callback)
{
int count = 0;
foreach (var cur in enumerable)
{
callback(cur, count);
count++;
}
}
답변
LINQ 솔루션을 구체적으로 요청했지만이 질문은 꽤 오래되었지만 비 LINQ 솔루션을 게시합니다. 이는 LINQ (= 언어 통합 쿼리 )가 컬렉션의 쿼리에 사용 되기 때문 입니다. 모든 LINQ 메서드는 기본 컬렉션을 수정하지 않고 새 컬렉션을 반환 합니다 (또는 더 정확한 반복자를 새 컬렉션에 반환). 따라서 예를 들어를 사용 Select
하여 기본 컬렉션에 영향을 미치지 않으면 서 새로운 컬렉션을 얻게됩니다.
물론 당신은 할 수 함께 할 ForEach
(안 그런데 LINQ,하지만 확장에이다 List<T>
). 그러나 이것은 문자 그대로foreach
어쨌든 사용 하지만 람다 표현과 함께 사용 됩니다. 이 외에도에서 모든 LINQ 방법은 내부적으로 사용하여 수집 등을 반복 할 foreach
또는 for
단순히 클라이언트에서 숨 깁니다 그러나. 나는 이것을 더 읽기 쉽고 유지 보수 할 수 있다고 생각하지 않습니다 (람다 식을 포함하는 메소드를 디버깅하는 동안 코드 편집을 생각하십시오).
LINQ를 사용 하여 컬렉션의 항목 을 수정 해서는 안됩니다 . 더 좋은 방법은 질문에 이미 제공 한 솔루션입니다. 클래식 루프를 사용하면 컬렉션을 쉽게 반복하고 항목을 업데이트 할 수 있습니다. 실제로 의존하는 모든 솔루션 List.ForEach
은 다르지 않지만 제 관점에서 읽기가 훨씬 어렵습니다.
따라서 컬렉션의 요소 를 업데이트 하려는 경우 LINQ를 사용하지 않아야합니다 .