2010-12-03 15 views
3

を更新することができません:今、私はFOOSのリストを持っている私はブール型フィールドを持つ単純なクラス持つジェネリックリストの内容に

public struct Foo { bool isAvailable; } 

を:

List <Foo> list = new List<Foo>(); 

その後、私は、各FOOを列挙するにリストとそのisAvailableフィールドを更新しよう:

foreach(Foo foo in list) { 
    foo.isAvailable = true; 
} 

しかし、上記のコードリストを更新することはありません。私はここで何が間違っているのか、その救済方法は何ですか?

+0

コードの関連する部分(おそらくバグを含んでいるもの)を投稿するのを "忘れて"います。どのように "Foo"のインスタンスとリストが更新されていないかを確認する方法でリストを埋める方法を教えてください。 –

+2

'Foo'はクラスではなくstructとして宣言されていますか? – Lucero

+1

あなたのフィールドはプライベートであるようです。 –

答えて

7

Fooは可変構造のためです。

リストから値をフェッチすると、コピーが作成されます。これは、値の型がどのように動作するのかということです。あなたは元の値を変更せずにコピーを変更しています。

提案:あなたはおそらく可変の構造体を作成しないでくださいクラス

  • を使用する必要があります

    • 。彼らは予測するのが難しいやり方で行動する、あるいは少なくともそれについて明示的に考えていないときに期待する方法ではない。

    あなたはたびに異なる方法でリストを反復処理し、値を交換するようにコードを変更することができますが、それは一般的にそうする悪い考えです。クラスを使用するか、リストを新しいリストに適切な値で投影してください。


    fooはそれが正常に動作する必要があり

    クラスだったオリジナルの答え、。例えば、ここに作業し短いが完全なプログラムです:はない作業を行い似て短いが、完全なプログラムにあなたの現在のコードを適応させる

    using System.Collections.Generic; 
    
    public class Foo 
    { 
        public bool IsAvailable { get; set; } 
        public string Name { get; set; } 
    
        public override string ToString() 
        { 
         return Name + ": " + IsAvailable; 
        } 
    } 
    
    class Test 
    { 
        static void Main() 
        { 
         List<Foo> list = new List<Foo>() 
         { 
          new Foo { Name = "First", IsAvailable = true }, 
          new Foo { Name = "Second", IsAvailable = false }, 
          new Foo { Name = "Third", IsAvailable = false }, 
         }; 
    
         Console.WriteLine("Before:"); 
         list.ForEach(Console.WriteLine); 
         Console.WriteLine(); 
    
         foreach (Foo foo in list) 
         { 
          foo.IsAvailable = true; 
         } 
    
         Console.WriteLine("After:"); 
         list.ForEach(Console.WriteLine); 
        } 
    } 
    

    てみてください、ポストは、私たちは働くことができます何が起こっているのか。

    +0

    ちょっと私はIsAvailableをフィールドとして使っていますが、それは何か違いがありますか?そしてFooはクラス – munna

    +0

    @ムンナ:ああ、それは重要な構造体であるという事実です。編集します。 –

    2

    構造体をクラスではなくFooとして使用しています。構造体は参照されずにコピーされるため、リストに格納されているオブジェクトではなくコピーのみが変更されます。

    ですから、基本的に2つのオプションがあります。それはクラス

  • リストに結果を再割り当てしてください

    • を。これを行うには、foreachの代わりにインデックスを使用して繰り返します。

  • 0

    リストを記入するときは、Fooクラスごとに新しいistanceを作成する必要があります。

    リストリスト=新しいリスト(); Foo foo =新しいFoo();

    foo.isAvailable = false; list.Add(foo);

    foo = new Foo(); list.Add(foo);

    foo = new Foo(); list.Add(foo);あなたはこのように埋める場合

    一覧リスト=新しいリスト(); Foo foo =新しいFoo(); list.Add(foo); list.Add(foo); list.Add(foo);

    あなたは、オブジェクトごとにスタック上の同じメモリ位置に参照されます。

    関連する問題