1

LINQ を使用してリストにいくつかの値を設定しようとしましたが、どういうわけか次のコードには値が設定されていません。

class Person
{
    public string name;
    public Person(string name)
    {
        this.name = name;
    }
}

List<Person> people = new List<Person>() { new Person("a"), new Person("b") };
people.Select(x => { x.name = "c"; return x; });
foreach (Person person in people)
{
    Console.WriteLine(person.name);
}

ただし、select メソッドを呼び出した後に ToList() を追加すると、値が設定されます。

List<Person> people = new List<Person>() { new Person("a"), new Person("b") };
people.Select(x => { x.name = "c"; return x; }).ToList();

さらに奇妙なことに、別の行で ToList() を呼び出すと、どちらも機能しません。

List<Person> people = new List<Person>() { new Person("a"), new Person("b") };
people.Select(x => { x.name = "c"; return x; });
people.ToList();
4

3 に答える 3

4

一般に、副作用を引き起こす LINQ クエリを生成しないことは常に良い考えです。Select()ここでのあなたの全体的な目標は、ステートメントに副作用を生み出すことです。

これが影響を与える理由ToList()は、結果を列挙するまで LINQ クエリが実行されないためです。 ToList()クエリ結果が完全に列挙されます (リストを作成するため)。あなたが書くなら:

foreach (Person person in people.Select(x => { x.name = "c"; return x; }))
{

foreach が結果を反復処理すると、効果が発生することがわかります。

そうは言っても、LINQ を使用して値を書き込む「適切な」方法は、フィルタリングしてから後で変更することです。

var peopleToEdit = people.Where(p => string.IsNullOrWhiteSpace(p.Name));
foreach(var person in peopleToEdit)
    person.Name = "Foo"; // Assign like so

基本的に、クエリには副作用がなく、通常の制御フローを使用して実際に値を編集する必要があります。

于 2012-09-06T22:25:29.330 に答える
0

.Where 句を使用します。

    List<Person> people = new List<Person>() { new Person("C"), new Person("b") };
    var something = people.Where(x => x.name == "C");
    foreach(var x in something)
    {

    }

これはテスト済み

于 2012-09-06T22:35:38.207 に答える