2012-05-24 7 views
6

double []型のリストをクラス内の関数に渡し、tempListを使用して関数内の値を編集してから編集した値を返します。 しかし、渡されているoriginalListも編集されており、編集してtempListと一致させたくありません。リストの編集に関する問題<double[]> in c#

ここにコードがあります。

配列は 参照タイプであることを念頭に
List<double[]> newList = new List<double[](); 
newList = myClass.myFunction(value, originalList); 

// myClass 
... 

// myFunction 
public List<double[]> myFunction(int value, List<double[]> myList) 
{ 
    List<double[]> tempList = new List<double[]>(); 
    for (int i = 0; i < myList).Count; i++) 
    { 
     tempList.Add(myList[i]); 
    } 


    // Do stuff to edit tempList 

    return tempList; 
} 
+0

が実際にあなたの質問は何で、何をやりたいのですか?元のリストを編集することはできますが、新しいものを作成する必要はありません。 –

答えて

4

ベア。 tempListに配列を追加すると、配列への参照のみが追加されるため、myListtempListは両方とも同じdouble[]オブジェクトを参照します。

代わりに、あなたは配列のクローンを作成する必要があります、

for (int i = 0; i < myList.Count; i++) 
{ 
    tempList.Add((double[])myList[i].Clone()); 
} 
+0

はい、しかし、最初の場所ではコードが厄介に見えます。アレイをクローンすることはめったに正しいことではありません。 –

0

あなたが持っている問題はdouble[]では、参照型ではなく、値型であるので、あなたのtempListに追加されたとき新しいオブジェクトではなく元のオブジェクトへの参照を追加しています。 tempListに追加する前に実際には新しいdouble[]を作成して、元のオブジェクトで作業していないようにする必要があります。

LINQを使用できると仮定すると、ループする必要はありません。

var tempList = myList.Select(x => x.ToArray()).ToList(); 
0

これは、コレクション/参照型が参照渡しされるためです。 (実際、保持変数は値渡しですが、すべての変数は同じ参照を指しています)。詳細説明については

は、あなたが私の機能で変更が元のコレクションに反映されていないことをしたい場合は、コピー/それのクローンを作成し、その後myFunctionに渡す必要がありthis SO Answer

をお読みください。

newList = myClass.myFunction(value, (List<double>)originalList.Clone()); 
1

アレイ、here double[]、参照型であるため、ライン

tempList.Add(myList[i]); 

は、元の配列への参照を追加しています。次にtempListを編集すると元の配列が編集されます。このようにコピーを作成します。

tempList.Add(myList[i].ToArray()); 
0
tempList.Add(myList[i]); 

あなたは私が一時リストにインデックスをダブル[]オブジェクトへの参照を追加することを意味します。 したがって、そのオブジェクトの値を編集すると、両方のリストでチャンスが得られます。

あなたがお互いに影響を与えません別の複製されたリストを持っているしたい場合は、あなたがそれを行う必要があります:あなたは、新しいリストを配列への参照を追加しますが、行っていない

List<double[]> tempList = new List<double[]>(); 
for (int i = 0; i < myList).Count; i++) 
{ 
    double[] originalListItem = myList[i]; 

    // the most important step here!!! - clone the originalListItem to clonedListItem 

    tempList.Add(clonedListItem); 
} 


// Do stuff to edit tempList 

return tempList; 
1

各配列の内容のコピー。あなたのコピーは次のようになります:

foreach (double[] item in myList) 
{ 
    double[] copy = new double[item.Length]; 
    Array.Copy(item, copy); 
    templist.Add(copy); 
} 
0

ダブルリスト[[]を新しいリストにコピーしています。これは浅いコピーです。 元の配列を変更せずに、テンポラリ配列を編集するにはディープコピーを作成し、新しいダブル配列を作成する必要があります。

0

配列のコピーではなく、tempListの配列への参照を挿入しています。したがって、tempListの値を変更すると、元の配列が変更されます。

このコードは、より良い仕事します:

for (int i = 0; i < myList.Count; i++) 
    { 
     var copy = new Double[myList[i].Length]; 
     Array.Copy(myList[i], copy, myList[i].Length); 
     tempList.Add(copy); 
    } 
関連する問題