2013-11-21 10 views
10

私のC#アプリケーションでListに奇妙な問題があります。割り当てミスであるか、私が何か間違っている(私は平均的なC#開発者です)必要があります。 私は近い私のラインに例を挙げてみましょう:ListでC# "面白い"問題<String[]>

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array); 

MyPrimaryList[0][0] += "half"; 

だから今はMyPrimaryListの最初の配列の最初の値がMySecondaryListで「onehalfが」と「1」であることを期待します。 しかし、私の問題/問題は、両方のリストの最初の配列の最初の値として "onehalf"で両方のリストが更新されるということです。

あなたは良い説明がありますか? :)

THANKS !!

+1

に適していますそれらはどちらも変更している配列要素を指しています。 –

+0

あなたは両方のリストに同じオブジェクトを追加しています。つまり、どこにもコピーを作成しない '配列'しかありません... – tpeczek

答えて

18

String[] array;でこれを行うことができます

は、参照型です。このオブジェクトのメモリ内の場所への参照を両方のリストに追加しました。したがって、両方とも同じデータを保持しています。

あなたがarrayのコピーを持っている第二のリストを必要とするなら、あなたはArray.Copyを使用することができます。

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 

String arrayList = "one,two,three,four,five"; 
String[] array = arrayList.Split(','); 
String[] array2 = new string[5]; 

Array.Copy(array, array2, 5); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array2); 

MyPrimaryList[0][0] += "half"; 

Console.WriteLine(MyPrimaryList[0][0]); 
Console.WriteLine(MySecondaryList[0][0]); 

これは、ソース配列、先の配列と長さがかかる - 配列の境界をチェックするように注意してくださいを。

これは出力:

onehalf 
one 

各リストは、現在別の配列への参照を保持しているので、あなたが独立して配列項目を操作することができます。

9

アレイの同じインスタンスを両方のリストに追加するので、同じメモリ構造を指しています。

これらを独立させたい場合は、それらを複製する必要があります。私の頭の上から素早く、リストの1つにlinq list.Add(array.ToArray())を使用しています

+1

'.Select(x => x)'は 'string [] 'すでにIEnumerable 'を実装しています。 –

+0

@Eren、ToArrayが配列を呼び出すと、新しいコピーを返すことが100%保証されていなかったので、私はそうしました。しかし、私はチェックして、それが動作する方法です –

7

配列は参照オブジェクトなので、メモリ内の同じコレクションを変更しています。あなたがやっているすべては、本質的に

あなたはあなたが欲しい自律性を得るために、アレイのディープコピーを行う必要があります。このドキュメントを参照

Passing Arrays as Arguments (C# Programming Guide)

を持って、同じ構造へのポインタを追加しています。あなたはArray.Copy

0

あなたは、あなたが今、あなたが同じメモリ構造

を指しているので、正しいコードがあるべきで作業している各リストの配列を作成する必要があります。

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 
String[] secondaryArray; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 
secondaryArray = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(secondaryArray); 

MyPrimaryList[0][0] += "half"; 

今、あなたの第二のリストを持っています「1」としない「onehalfが」最初の要素として

0

挙げ配列は参照型であるため、両方のリストには、同じアレイ

を指し示すことになるようにそれはその配列の浅いコピーを行うだろうけど Clone方法..

MyPrimaryList.Add((String[])array.Clone()); 
MySecondaryList.Add((String[])array.Clone()); 

を使用し、あなたの問題を解決するために、3210

が、それはあなたがそう、両方のリストに同じ配列を追加しているあなたのケース

関連する問題