2012-03-27 4 views
0

응용 프로그램을 실행하는 동안 일부 값을 추적하는 여러 목록이있는 응용 프로그램이 있습니다. 특히 List1, List2 및 MainList가 있습니다.목록 목록 업데이트

List1과 List2는 String 유형이고 MainList는 다른 두 목록의 목록입니다.

내 응용 프로그램에서 응용 프로그램이 실행 중일 때 목록의 값을 업데이트하고 변경하려고하지만이 작업을 수행하는 방법을 찾는 데 문제가 있습니다.

파일에서 사진을 처리하는 이미지 조작 응용 프로그램입니다. 응용 프로그램은 파일의 모든 사진에 대한 목록 값을 처리해야합니다. 따라서 모든 사진을 반복하고 각 반복마다 목록을 업데이트하는 루프가 생깁니다.

내 알고리즘은 다음과 같아야합니다. * 첫 번째 이미지 인 경우 List1에 문자열을 추가하십시오. 그런 다음 List1을 MainList에 추가하십시오. * 연속되는 각 이미지에 대해 해당 이미지의 문자열을 List2에 추가하십시오. 그런 다음 List2를 MainList에 추가하십시오. List1을 MainList에 추가 된 마지막 목록으로 설정하십시오. 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_ 내 MainList에 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에 추가 된 마지막 값을 가져옵니다.

방법에서 마지막 행 번째

은 :

StringList2.Clear(); 

StringList1StringList2의 스택 참조가 가리키는 오브젝트에 동일한 스택 기준이다. 그래서 본질적으로 여기에 실제로 작업하고있는 목록이 하나 있습니다. 결국 Clear()을 스택 참조에 호출 했으므로 힙 개체 만 가리키면 완전히 비어 있습니다. 같은 것을 반복해서 사용하는 대신 새로운 List 개체를 만들어야합니다.

EDIT : Derp, Jodrell이 나를 때렸다.

+0

글쎄, 당신의 대답은 맞아. – Jodrell