[C#] LINQ : 새 개체를 만들지 않고 개체를 선택하고 속성을 변경하십시오.

새 개체를 만들고 모든 속성을 수동으로 설정하지 않고 LINQ 쿼리 결과 개체의 일부 속성을 변경하고 싶습니다. 이게 가능해?

예:

var list = from something in someList
           select x // but change one property



답변

쿼리 구문이 무엇인지 잘 모르겠습니다. 그러나 다음은 확장 된 LINQ 표현 예제입니다.

var query = someList.Select(x => { x.SomeProp = "foo"; return x; })

이것이하는 것은 익명의 방법과 표현을 사용하는 것입니다. 이를 통해 하나의 람다에서 여러 명령문을 사용할 수 있습니다. 따라서 속성을 설정하고 객체를이 간결한 방법으로 반환하는 두 가지 작업을 결합 할 수 있습니다.


답변

모든 요소의 속성을 업데이트하려는 경우

someList.All(x => { x.SomeProp = "foo"; return true; })


답변

나는 이것을 선호합니다. 다른 linq 명령과 결합 될 수 있습니다.

from item in list
let xyz = item.PropertyToChange = calcValue()
select item


답변

LINQ 마법이 없어야합니다. 익명 유형을 반환하지만 투영을 사용하지 마십시오.

User u = UserCollection.FirstOrDefault(u => u.Id == 1);
u.FirstName = "Bob"

그러면 실제 객체와 다음이 수정됩니다.

foreach (User u in UserCollection.Where(u => u.Id > 10)
{
    u.Property = SomeValue;
}


답변

표준 쿼리 연산자로는 불가능합니다. 언어 통합 업데이트가 아니라 언어 통합 쿼리입니다. 그러나 확장 방법으로 업데이트를 숨길 수 있습니다.

public static class UpdateExtension
{
    public static IEnumerable<Car> ChangeColorTo(
       this IEnumerable<Car> cars, Color color)
    {
       foreach (Car car in cars)
       {
          car.Color = color;
          yield return car;
       }
    }
}

이제 다음과 같이 사용할 수 있습니다.

cars.Where(car => car.Color == Color.Blue).ChangeColorTo(Color.Red);


답변

Where절을 사용하여 항목을 업데이트하려면 .Where (…)를 사용하면 다음 과 같은 경우 결과가 잘립니다.

mylist = mylist.Where(n => n.Id == ID).Select(n => { n.Property = ""; return n; }).ToList();

다음과 같이 목록에서 특정 항목을 업데이트 할 수 있습니다.

mylist = mylist.Select(n => { if (n.Id == ID) { n.Property = ""; } return n; }).ToList();

변경하지 않아도 항상 반품하십시오. 이런 식으로 목록에 유지됩니다.


답변

우리는 종종 새로운 객체를 만들지 않고 색인 값과 목록의 첫 번째 및 마지막 표시기를 포함하려고합니다. 이를 통해 기존 클래스를 수정하지 않고 목록의 첫 번째 항목인지 마지막 항목인지 알 필요없이 목록에서 항목의 위치, 열거 등을 알 수 있습니다.

foreach (Item item in this.Items
    .Select((x, i) => {
    x.ListIndex = i;
    x.IsFirst = i == 0;
    x.IsLast = i == this.Items.Count-1;
    return x;
}))

다음을 사용하여 클래스를 간단하게 확장 할 수 있습니다.

public abstract class IteratorExtender {
    public int ListIndex { get; set; }
    public bool IsFirst { get; set; }
    public bool IsLast { get; set; }
}

public class Item : IteratorExtender {}