6

タイプ double[] のリストをクラスの関数に渡し、tempList を使用して関数内の値を編集し、編集した値を返します。しかし、渡される originalList も編集されているため、tempList と一致するように編集したくありません。

これがコードです。

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;
}
4

8 に答える 8

4

配列は参照型であることに注意してください。に配列を追加すると、配列へtempListの参照のみが追加されるため、myListtempListの両方が同じdouble[]オブジェクトを参照します。

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

for (int i = 0; i < myList.Count; i++)
{
   tempList.Add((double[])myList[i].Clone());
}
于 2012-05-24T14:57:15.960 に答える
1

配列への参照を新しいリストに追加していますが、各配列の内容のコピーは作成していません。コピーは次のようになります。

foreach (double[] item in myList)
{
    double[] copy = new double[item.Length];
    Array.Copy(item, copy);
    templist.Add(copy);
}
于 2012-05-24T14:59:13.373 に答える
1

配列here double[]は参照型なので、行

tempList.Add(myList[i]);

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

tempList.Add(myList[i].ToArray());
于 2012-05-24T14:57:41.143 に答える
0

double[] 参照を新しいリストにコピーしています。これは浅いコピーです。元の配列を変更せずに一時配列を編集するには、ディープ コピーが必要で、新しい double 配列を作成します。

于 2012-05-24T15:01:02.350 に答える
0

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

LINQ を使用できると仮定すると、ループする必要はありません。次のようなことができます:

var tempList = myList.Select(x => x.ToArray()).ToList();
于 2012-05-24T14:57:23.030 に答える
0

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

詳細な説明については、このSO Answerをお読みください

私の関数の変更が元のコレクションに反映されないようにするには、それをコピー/クローンしてからに渡す必要がありmyFunctionます。

newList = myClass.myFunction(value, (List<double>)originalList.Clone());
于 2012-05-24T14:57:31.377 に答える
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);
    }
于 2012-05-24T15:02:39.393 に答える
0
tempList.Add(myList[i]);

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

互いに影響を与えない別の複製リストが必要な場合は、次のようにする必要があります。

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;
于 2012-05-24T14:57:47.813 に答える