LINQ:select一个对象并改变一些属性而不创build一个新的对象

使用LINQ,如果我想执行一些查询并从查询中返回对象,但只改变该对象的一些属性,我将如何做到这一点,而无需创build一个新的对象,并手动设置每个属性? 这可能吗?

例:

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

我不确定查询语法是什么。 但是这里是扩展的LINQexpression式示例。

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

这是做什么用一个匿名方法vs和expression式。 这允许你在一个lambda中使用几个语句。 所以你可以把设置属性和把对象返回到这个简单的方法这两个操作。

如果你只是想更新所有元素的属性然后

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

我更喜欢这个。 它可以和其他linq命令结合使用。

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

不应该有任何LINQ魔术阻止你这样做。 不要使用投影,但会返回一个匿名types。

 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); 
 var item = (from something in someList select x).firstordefault(); 

会得到的项目,然后你可以做item.prop1 = 5; 改变具体的财产。

或者你是否想从数据库中获取项目列表,并让它将该返回列表中每个项目的属性prop1更改为指定的值? 如果是这样,你可以做到这一点(我在VB中做,因为我知道它更好):

 dim list = from something in someList select x for each item in list item.prop1=5 next 

(列表将包含您的更改返回的所有项目)

由于我没有find答案,我认为这是最好的解决scheme,在这里我的方式:

使用“select”来修改数据是可能的,但只是一个窍门。 无论如何,“select”不是为了这个。 它只是在与“ToList”一起使用时执行修改,因为在需要数据之前Linq不会执行。 无论如何,最好的解决scheme是使用“foreach”。 在下面的代码中,你可以看到:

  class Person { public int Age; } class Program { private static void Main(string[] args) { var persons = new List<Person>(new[] {new Person {Age = 20}, new Person {Age = 22}}); PrintPersons(persons); //this doesn't work: persons.Select(p => { p.Age++; return p; }); PrintPersons(persons); //with "ToList" it works persons.Select(p => { p.Age++; return p; }).ToList(); PrintPersons(persons); //This is the best solution persons.ForEach(p => { p.Age++; }); PrintPersons(persons); Console.ReadLine(); } private static void PrintPersons(List<Person> persons) { Console.WriteLine("================"); foreach (var person in persons) { Console.WriteLine("Age: {0}", person.Age); ; } } } 

在“foreach”之前,你也可以做一个linqselect…

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