새 개체를 만들고 모든 속성을 수동으로 설정하지 않고 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 {}