3

私は次のことをしようとしています...(Fooはクラスです)

void Main() 
{
    var foos = ...
    DoSomeWork(foos);
    // I want all foos to have Bar set to 42
}

public static void DoSomeWork(IEnumberable<Foo> foos) 
{
    foreach (var foo in foos)
    {
        foo.Bar = 42;
    }
}

class Foo 
{
    String blahblah;
    Int32 Bar;
}

しかし、すべての foo には元の値があります。ref パラメータでそれらを変更するにはどうすればよいですか?

4

3 に答える 3

3

ToListまたはのようなメソッドを使用して LINQ クエリの実行を強制しないためToArray、クエリを列挙するたびに、もう一度実行されます。メソッドを使用してクエリ結果をキャッシュし、ToListそのリストをDoSomeWorkメソッドに渡す必要があります。

于 2011-10-27T05:52:06.377 に答える
2

それはfoos生成されている可能性がありますIEnumerable。例:

IEnumerable<Foo> GetFoos()
{
  yield return new Foo {};
  yield return new Foo {};
  yield return new Foo {};
}

var foos = GetFoos();

生成される値を変更することはできません。反復するたびに新たに作成されるためですfoos

@YuriyRozhovetskiyの提案に従って次のことを行った場合、機能します。

var foos = GetFoos().ToList();

今、私たちは幸せに変異することができます:)

于 2011-10-27T05:51:05.993 に答える
0

これは奇妙です。参照型 (クラス) では機能するはずですが、値型 (構造体) ではコンパイルされません。

まず、ref IEnumerable を DoSomeWork に渡す必要はありません。コレクション オブジェクトを変更したくないためです。内部の要素のみを変更します。

あなたのケースを再現しようとしましたが、以下のコードで問題なく動作します。詳細を教えていただけますか?

  • 渡すコレクション (List、Set) は何ですか?
  • Bar がプロパティの場合 - どのように実装されていますか?
  • Foo は参照型 (クラス) ですか?

作業コード:

class Foo
{
    public Foo(int bar, int baz)
    {
        Bar = bar;
        Baz = baz;
    }
    public int Bar { get; set; }
    public int Baz;
}

class Program
{
    static void Main(string[] args)
    {
        var foos = new List<Foo>(new[]
        {
            new Foo(1, 2),
            new Foo(3, 4),
            new Foo(5, 6)
        });
        DoSomeWork(foos);
    }

    private static void DoSomeWork(IEnumerable<Foo> foos)
    {
        foreach (var foo in foos)
        {
            foo.Bar = 42;
            foo.Baz = 42;
        }
    }
}
于 2011-10-27T05:48:58.920 に答える