1

次のコードを使用して、IEnumerableをステップ実行しました。

IEnumerable<Thing> things = ...;
foreach (Thing thing in things)
  thing = method(thing);

反復変数であるものを参照しているので、コンパイラーはそれに同意しません。もちろん、代わりに、リスト内の基になるオブジェクトに影響を与えるつもりです。それ、どうやったら出来るの?

今のところ、数値化された反復を使用して回避策を実行しましたが、2つの問題があります。一つには、私見をコーディングするのは良くありません。それに加えて、 IEnumerableからIListに変更する必要があります(またはListを使用する必要がありますか?!)。これは、物事が大きくなると腰に噛み付きます。

//List<Thing> things = ...;
IList<Thing> things = ...;
for (int i = 0; i < things.Count(); i++)
  things[i] = method(things[i]);
4

5 に答える 5

4

Linqを使用してシーケンスを投影できます。

 var transformedThings = things.Select(t => method(t));
于 2013-03-18T12:15:16.947 に答える
2

すべての要素に対してメソッドを実行する場合は、コレクション全体を変換してみませんか。

public IEnumerable<Thing> TransformThings(IEnumerable<Thing> input)
{
    foreach (var thing in input)
        yield return method(thing);
}

次のように使用できます。

var transformedThings = TransformThings(things);

これにより、コレクションを反復処理するときに各要素が変換されます。つまり、コレクション全体をメモリに列挙する必要はありません。

編集

さらに簡単:

var transformedThings = things.Select(thing => method(thing));
于 2013-03-18T12:11:53.417 に答える
1

アイテムの置換は、配列などのコレクションを使用するか、List<T>(説明したように)forループ (not foreach) を使用して簡単に行うことができます。

ステートメントを使用してオブジェクトを置き換える方法はありません。foreach

IEnumerable<T>本当にインターフェイスを使用したい場合は、2 つの選択肢があります。

  1. Thingsのシーケンスを変換しますIEnumerable<T>.Select()(メソッドを参照)。この場合、 のソース シーケンスとソース インスタンスはThing 変更されません

    例えば:

    var newThings = things.Select(t => new Thing(/* pass different values using original t instance */));
    
  2. 各インスタンスの状態を更新します。

    class Thing
    {
        public void UpdateState(/* parameters */)
        {
            // Update field/property values, etc.
        }
    }
    
    ...        
    
    foreach (var thing in things)
        thing.UpdateState(/* new values */);
    
于 2013-03-18T12:21:00.557 に答える
1

列挙子で制限されているため、リスト内のアイテムを反復するときに参照を変更することはできませんが、アイテム内のオブジェクトを変更することはできます....

強力な LINQ を使用するか、ToList() や ToArray() のようにリストを複製します。

于 2013-03-18T12:24:13.100 に答える
0

ウィルの長さがIEnumerable同じであれば、ループを使用ToArray()して反復します。for

例えば:

char[] chars = "somestring".ToArray();
for (int i = 0; i < chars.Length; i++)
{
  chars[i] = SomeMethod();
}

コレクション内の何かを変更するため。

Thing[] things = ...;
for (int i = 0; i < things .Length; i++)
{
  AddOne(ref things[i]);
}

public void AddOne(ref Thing t)
{
  t.Foo += 1;
}
于 2013-03-18T12:18:40.197 に答える