[C#] LINQ를 사용하여 컬렉션의 모든 개체 업데이트

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를 사용하지 않아야합니다 .