2017-12-01 17 views
0

C#これを行うことはできません。C#リスト内で反復処理中にオブジェクトのプロパティを設定します。

foreach (Point point in filledPoints) 
{ 
    point.X = 0; 
} 

filledPointsは、それは私のコンパイラエラーを与えるList<Point> です:「filledPoints foreachの反復変数であるので、関連するメンバーを編集することはできません」申し訳ありませんが、メッセージはドイツ語であると翻訳に悪いIM( )。しかし、この作品:

なぜこれはうまくいかず、それを迂回するよりエレガントな方法はありますか?

+1

エラーメッセージは、それが動作しない理由を正確に示しています。 – Servy

+0

それは動作しませんが、なぜか@Servy –

+2

私にそれはあなたにそれが動作しないと言うことを疑うことはないと伝えます。デバッガの使い方を知っていますか?その場合はブレークポイントを設定し、有効なエラーを教えてください – MethodMan

答えて

6

これは、Pointが参照型(クラスではない構造体)ではないためです。したがって、foreach内のポイント変数は、実際には元のPointへの参照ではなく、コピーです。コンパイラは、あなたがそうでないときにオリジナルを変更していると思うのは簡単だと思いますので、あなたはそれを変更させません。

私はもっと良い方法があるかどうかわからないが、あなたはこのような何かを行うことによってこの問題を回避できます。

for (int i = 0; i < filledPoints.Count; i++) 
{ 
    Point temp = filledPoints[i]; 
    temp.X = 10; 
    filledPoints[i] = temp; 
} 
+0

意味があります。代替クラスがありますか、それとも作成する必要がありますか? –

+0

ちょっと面倒ですが、forループと一時的なPoint変数を使用できます。私は答えを例で編集します。 – Joeyrp

+1

@Joeyrpはコードを削除しないでください。その正しい方法です。将来の読者がOPの貧弱なソリューションを再現するのは嫌いです。 OPに関しては、あなたは本当にそれを却下するのではなく、人々の助言を聞くべきです。 – maccettura

-2

forループを使用すると、filledPointsに格納されているオブジェクトに割り当てることができます。

for (int i = 0; i < filledPoints.Length; i++) 
{ 
    filledPoints[i].X = 0; // replace 0 with the desired value 
} 

注:使用しているコレクションの種類に応じて、あなたは「.Count()」で上記のコードで「.LENGTH」を交換する必要があります。

+0

いいえ、動作しません。 filledPoints [i]の最後に.Xを忘れてしまった。また、それを追加しても、 –

+0

"戻り値\リスト" で動作しません。この[int] \ "は変数ではありません" –

+0

".X"を追加するように更新 お詫び – Cathal

1

@Cathalが近かったです。あなたはこのようなforループを使用する必要があります。

for(int i = 0; i < points.Length; i++) 
{ 
    //This copies the value of the point at the i index into a variable called point 
    Point point = points[i]; 

    //Modifying the point.X property of the copy 
    point.X = 0; 

    //This replaces the point that is at the i index, with the new point that has the modified X property 
    points[i] = point; 
} 

フィドルhere

EDIT

私はあなたのforeachの道を働いていない理由を説明するために私のバイオリンにいくつかのコメントや追加のコードを追加しましたあなたと思います。

+0

これは私がすでにforeachループを使っていないことでした。ありがとうございますが、それ以上の助けは必要ありません:D –

+0

@KeineAhnung私はあなたの 'foreach'ループがあなたが望むように動作するとは思わない。私の答えを見直したいかもしれません。 – maccettura

+0

foreachループでうまく動作します。私はちょうどこれらのintを格納する独自のクラスを作成する必要がありました。もう1つは構造体で、格納するとコピーされます。 @maccettura –

関連する問題