2009-08-27 44 views
1

在以下情形的擴展方法,我查詢列表對象和匹配的謂詞我要更新一些值:用於更新的LINQ到對象

var updatedList = MyList 
       .Where (c => c.listItem1 != "someValue") 
       .Update (m => {m.someProperty = false;}); 

唯一的問題是有沒有更新的擴展方法。如何去做這件事?

我的目標是更新只有在我的列表中匹配條件而保持其他項目完好無損的條目。

回答

7
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var people = new List<Person> { 
       new Person{Name="aaa", Salary=15000, isHip=false} 
       ,new Person{Name="aaa", Salary=15000, isHip=false} 
       ,new Person{Name="bbb", Salary=20000, isHip=false} 
       ,new Person{Name="ccc", Salary=25000, isHip=false} 
       ,new Person{Name="ddd", Salary=30000, isHip=false} 
       ,new Person{Name="eee", Salary=35000, isHip=false} 
      }; 


      people.Where(p => p.Salary < 25000).Update(p => p.isHip = true); 

      foreach (var p in people) 
      { 
       Console.WriteLine("{0} - {1}", p.Name, p.isHip); 
      } 


     } 
    } 

    class Person 
    { 

     public string Name { get; set; } 
     public double Salary { get; set; } 
     public bool isHip { get; set; } 
    } 


    public static class LinqUpdates 
    { 

     public static void Update<T>(this IEnumerable<T> source, Action<T> action) 
     { 
      foreach (var item in source) 
       action(item); 
     } 

    } 


} 
+0

東西讓我有關Update方法有點噁心,但我想這不是題。 – Rob 2009-08-27 23:03:23

+0

感謝羅!剛開始鑽研這整個LINQ場景。 – 2009-08-28 05:06:00

+2

請注意,此擴展方法通常被稱爲「ForEach」,因爲它沒有任何特定於更新的內容......它僅針對每個項目執行。 – 2009-09-12 16:36:38

1
foreach(var item in MyList.Where(c => c.listItem1 != "someValue")) 
{ 
    item.someProperty = false; 
} 
4

或者你可以使用自帶的.net框架的擴展方法:

var updatedList = MyList 
       .Where (c => c.listItem1 != "someValue") 
       .ForEach(m => m.someProperty = false);