2010-05-26 5 views
8

람다 식을 처음 사용하고 문법을 활용하여 컬렉션의 한 속성 값을 설정하고자합니다 컬렉션람다 식 - 컬렉션의 다른 속성 값을 기반으로 개체 컬렉션에서 하나의 속성 값을 설정합니다.

다른 값에 기초하여 일반적으로 I 루프를 수행 할 것이다 :

class Item 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

void Run() 
{ 
    Item item1 = new Item { Name = "name1" }; 
    Item item2 = new Item { Name = "name2" }; 
    Item item3 = new Item { Name = "name3" }; 

    Collection<Item> items = new Collection<Item>() { item1, item2, item3 }; 

    // This is what I want to simplify. 
    for (int i = 0; i < items.Count; i++) 
    { 
     if (items[i].Name == "name2") 
     { 
      // Set the value. 
      items[i].Value = "value2"; 
     } 
    } 
} 

답변

14

LINQ 일반적으로 데이터를 수정하는 것보다 데이터를 선택하기위한보다 유용하다. 그러나 이런 식으로 뭔가를 작성할 수

foreach(var item in items.Where(it => it.Name == "name2")) 
    item.Value = "value2"; 

수정해야하고 그들 모두는 표준 필수 루프를 사용하여 수정이 첫 번째 선택 항목. ForEach는 .NET이기 때문에, 당신이 중간에 ToList를 추가 할 필요가

items.Where(it => it.Name == "name2").ToList() 
    .ForEach(it => it.Value = "value2"); 

참고 :이 목록에 사용할 수 ForAll 방법과 foreach 루프를 대체 할 수 있지만, 나는 이것이 당신에게 어떤 이점을 제공합니다 생각하지 않는다 2.0 List<T> 유형에만 사용할 수있는 기능 - 모든 IEnumerable<T> 유형 (다른 LINQ 방식과 동일) 용인 것은 아닙니다. 그것은 또한 당신이 어떤 돌연변이를하고있어 분명히 있음을 만들기 때문에, 나는 foreach 루프를 선호하는 것, 어쨌든

public static void ForEach<T>(this IEnumerable<T> en, Action<T> f) { 
    foreach(var a in en) f(a); 
} 

// Then you can omit the `ToList` conversion in the middle 
items.Where(it => it.Name == "name2") 
    .ForEach(it => it.Value = "value2"); 

을 - 그리고이를 볼 때 유용합니다 :이 방법을 좋아한다면, 당신은 IEnuerable<T>에 대한 ForEach을 구현할 수 있습니다 사실 코드에서 쉽게

+0

약간의 수정 : it.value = "value2"... –

+0

아름답습니다. 루프를 돌면 안돼? –

+0

@Michael Rut, 루프가 ForEach 메서드보다 잘 읽지 만 의견의 문제입니다. 나는 Tomas가 그의 대답에서 행동의 명확성에 관해 말한 것에 동의한다. 그러나 그는 루프를 추상화하는 방법을 보여주었습니다 (분명히 루프가 생기지 만 명시 적으로 코드화할지 여부는 분명합니다). –

관련 문제