使用LINQ更改集合中的项

7

I have the following code:

List<Car> allCars = new List<Car>
{
    new Car(1977, "Ford", "Pinto"),
    new Car(1983, "Ford", "Taurus"),
    new Car(1981, "Dodge", "Colt"),
    new Car(1982, "Volkwagen", "Scirocco"),
    new Car(1982, "Dodge", "Challenger")
};

Array.ForEach(allCars.ToArray(), Console.WriteLine);

// I want to do an "in-place" modification of an item in 
// the list
var query = allCars.Select(x =>
{
    if (x.Model == "Colt") return "Dart";
});

public class Car
{
    public int Year { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }

    public Car(int year, string make, string model)
    {
       Year = year; Make = make; Model = model;
    }

    public override string ToString()
    {
        return string.Format("{0} - {1} {2}", Year, Make, Model);
    }
}

现在我知道我可以这样做:

var query = allCars.Select(c => c.Model == "Colt");

或者这个:
for (var item in allCars.Select(c => c.Model == "Colt"))
{
    item.Model = "Dart";
}

或者这个:
allCars.Single(c => c.Model == "Colt").Model = "Dart";

但是如何在列表中“原地”修改项目?

如果我需要修改两个属性,那么前面提到的方式就不太适用了。

2个回答

17

这真的很棒,我很欣赏在保持集合不可变的同时仍然能够更改项目名称的想法。这个答案今天真的帮了我很多! - Leonardo Wildt
编译器不允许这样做。它会产生错误。“无法修改'item'的成员,因为它是一个'foreach迭代变量” - Emre Kantar
1
@EmreKantar:如果迭代变量的类型是结构体,则这是正确的。在OP的问题中,它是一个类,这个解决方案将起作用。 - Flynn1179

1
foreach(var item in allCars.Where(c => c.Model == "Colt"))
{
    item.Model = "Dart";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接