7

次のコードがあります。

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";

しかし、リスト内のアイテムを「その場で」変更するのはどうですか?

変更するプロパティが 1 つある場合は、最後に述べた方法で問題なく動作しますが、2 つある場合はどうなるでしょうか。

4

2 に答える 2

17

LINQはクエリ言語であり、元のコレクションを不変に保つ必要があります。

これで結構です

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

LINQに実装されていない理由については、この投稿をお読みください

于 2013-02-01T19:18:19.117 に答える
1
foreach(var item in allCars.Where(c => c.Model == "Colt"))
{
    item.Model = "Dart";
}
于 2013-02-01T19:32:30.740 に答える