2009-07-21 7 views
23

を変更します。どうして?私は何をしなければならないのですか?は、私は次のコードを持っているリスト内の要素の値<T> .ForEachするForEachメソッド

newsplit = newsplit.Select(x => "WW"); 

あなたが現在持っているコードは、以下と等価です:

foreach(string x in newsplit.ToList()) { 
    AssignmentAction(x); 
} 

... 

public static void AssignmentAction(string x) { 
    x = "WW"; 
} 

この方法が原因のxを変更することはありませんnewsplitはあなたが欲しい、IEnumerable<string>であると仮定すると

答えて

33

C#の値渡しのセマンティクスと文字列の不変性

+0

は、文字列配列または私の場合はリストのIEnumerableですか? – Jon

+0

@Jon:配列とリストはすべてIEnumerableインターフェイスをサポートしています –

+1

Select()はJonが望むものではないと思います。IEnumerable自体を変更したいと思うようです。選択すると、すでに "WW"のアイテムが表示されます – AgileJon

0

LINQ式がAnonymous Typesを作成しているためです。これらは読み取り専用です。彼らには割り当てられません。また、各ループの標準では、列挙されているコレクションに割り当てることはできません。試してください:

foreach (var item in newsplit) 
    { 
     item = "this won't work"; 
    } 
+0

指定されたForEach式で作成された匿名型はありません。パラメータはデリゲートであり、反復の各要素に適用されます。もちろん、あなたが与える理由のために働かないでしょう。 –

+0

あなたは正しいです、もちろん私は何を考えていたのかわかりません!しかし、2番目の部分は、反復されたときにコレクションが不変であることに注意する価値があります。ありがとう。 –

2

ForEachでは、IEnumerableの要素を操作できますが、要素の参照は変更できません。

すなわち、これは文字列"WW"にIEnumerableを内の各要素のFooプロパティを設定します:

newsplit.ToList().ForEach(x => x.Foo = "WW"); 

ただし、IEnumerableを自体の内部値を変更することはできません。

+0

少なくともVB.Netでは、複数行のForEach、Linq ForEachが参照によって割り当てられない場合、ForEach内の要素のプロパティのみを割り当てることができました。 – Brent

17

他の回答から、現在のコードが機能しない理由が説明されています。

// Must be in a static non-nested class 
public static void ModifyEach<T>(this IList<T> source, 
           Func<T,T> projection) 
{ 
    for (int i = 0; i < source.Count; i++) 
    { 
     source[i] = projection(source[i]); 
    } 
} 

はその後、このように使用します:

newsplit.ModifyEach(x => "WW"); 

そのようなアレイとList<T>としてIList<T>のいずれかの実装で動作します。ここにそれを修正するだろう拡張メソッドです。任意のIEnumerable<T>で動作する必要がある場合は、シーケンス自体が変更できない可能性があるため、問題があります。私はそれがあると思ういけないよう

Select()を使用すると、当然のより機能的なアプローチであるが、時には既存のコレクションを変異することはやる価値です...

+1

@ジョン:私はあなたの2番目のコードブロックのNewsplit.ToList()。ModifyEach(x => "WW")を意味すると思いますか? – jason

+2

@Jason:ほぼ...しかし、ToList()を呼び出してもその新しいリストへの参照を保持しないと、変更は保持されません。特に、元のコレクションを変更することはありません。意図された使用のための答えを編集しました。 –

+0

@Jon:同意します。明確化のためにありがとう。 – jason

関連する問題