2012-03-27 7 views
0

私は、アプリケーションの実行中にいくつかの値を追跡するためのいくつかのリストを持つアプリケーションを持っています。特に、List1、List2、MainListを持ちます。リストのリストを更新する

List1とList2はString型で、MainListは2つの他のリストのリストです。

私のアプリケーションでは、アプリケーションの実行中にリストの値を更新したり変更したりしたいが、これを行う方法が分からない。

ファイルから写真を処理する画像操作アプリケーションです。アプリケーションは、ファイル内のすべての写真のリストの値を処理する必要があります。したがって、すべての写真を繰り返し処理し、各反復でリストを更新するループを作成します。

アルゴリズムは次のようになります。 *最初の画像の場合は、List1に文字列を追加します。次に、List1をMainListに追加します。 *連続する画像ごとに、その画像の文字列をList2に追加します。次に、List2をMainListに追加します。 MainListに追加された最後のListとしてList1を設定します。 Clear List2

問題は、List2データをクリアすると、設定されているList1のデータもクリアされるという問題です。これをどうやって止めることができますか?うまくいけば私のコードを囲みました。私のコードでは、最初の画像がアルゴリズムをテストしていたかどうかを確認するチェックを省略しました。

List<List<String>> MainStringList = new List<List<String>>(); 
List<String> StringList1 = new List<String>(); 
List<String> StringList2 = new List<String>(); 

StringList1.Add("My Car"); 
StringList1.Add("My Engine"); 
StringList1.Add("My Wheel"); 

MainStringList.Add(StringList1); 

StringList2.Add("My Flower"); 
StringList2.Add("My Honey"); 
StringList2.Add("My Love Heart"); 

DoStuff(StringList1, StringList2); 

private void DoStuff(List<String> StringList1, List<String> StringList2) 
{ 
    // Perform some calculations 
    // Then add to list 
    MainStringList.Add(StringList2); 

    int mainStringListCount = MainStringList.Count; 

    StringList1 = MainStringList[mainStringListCount - 1]; 

    String test1 = StringList1[2]; 

    StringList2.Clear(); 

    String test2 = StringList1[2];  // Problem is here - clears StringList2 as well as StringList1 
} 
+0

@Hans Moolman StringList2.Clear();あなたがStringList1 = StringList2と言っていない限り、StringList1をクリアしません...しかし、私はあなたのコードでそれを見ません... – NiK

+0

私はC#でそれをやっていると言って申し訳ありません。 _italic StringList2。クリア(); StringList1 = StringList2_と言う場合を除き、StringList1はクリアされません.MemoryListにStringList2を追加し、StringList1を設定してStringList1を設定すると、実際にクリアされます。私はコードを踏んで、StringList2.Clear()の後StringList1の値はすべてnullです。私が途中で間違った何かをしていない限り、私は私がそうであると示唆する何かを見ることができないのですか? – heyred

答えて

0

さて、私は

MainStringList.Add(StringList2); 
// list count goes up from 1 to 2 

int mainStringListCount = MainStringList.Count; 
// Set mainStringListCount = 2 

StringList1 = MainStringList[mainStringListCount - 1]; 
// Set StringList1 to the reference at index 1 (2 - 1) of your array 
// This sets Stringlist1 to StringList2 since arrays are 0 based. 
// StringList1 and StringList2 now both referece the same list. 

StringList2.Clear(); 
// Clears the list that is referecned by both variables 
0

は、ここに私が気づいたいくつかの問題です、それを順を追ってみましょう(このコメント作られたが、それはいくつかの間隔なしであまりにも複雑だだろう)。あなたのDoStuff()メソッドで

MainStringList.Add(StringList2); 

...これはMainStringListStringList2オブジェクト参照値を追加します。あなたがそれを理解していただければ幸いです

StringList1 = MainStringList[mainStringListCount - 1]; 

...これは、あなたは自分のDoStuffメソッドのコードの最初の行に追加するものですMainStringListに追加された最後の値を取得します。

方法の最後の行に2番目である:

StringList2.Clear(); 

StringList1StringList2のスタック参照が指していることを正確に同じオブジェクトにスタック参照あります。実際にここで作業しているリストが1つあります。Clear()をスタック参照で呼び出すため、ヒープオブジェクトListを指しているため、実際にここで作業しているリストが1つあります。同じものを何度も繰り返し使用するのではなく、新しいListオブジェクトを作成する必要があります。

EDIT:Derp、Jodrellが私を倒しました。

+0

あなたの答えは正しいです – Jodrell

関連する問題