2010-06-29 4 views
-2

다음 샘플 코드가 있습니다. lTest를 캡처하여 lRet과 동일한 값을 얻는 것을 좋아하지 않습니다. Addmore2Test 함수에 "List<Test> lTest1 = lTest0;"을 소개하려고했습니다. 작동하지 않습니다. 이 작업을 수행하는 적절한 방법은 무엇입니까?List <> 매개 변수가있는 C# 함수의 캡처 된 변수

감사합니다.

코드 -

private void Test(){ 
    List<Test> lTest = GetInitTestList(); 

    List<Test> lRet = AddMore2Test(lTest); 
} 

private List<Test> AddMore2Test (List<Test> lTest0) { 
    List<Test> lTest1 = lTest0; 

    return lTest1.Where(…); 
} 
+3

당신이하려는 일이나 "작동하지 않는다"는 말은 전혀 분명하지 않습니다. 짧지 만 완성 된 * 프로그램을 작성하여 원하는 결과와 함께 실제 결과가 무엇인지 알려주면 도움이 될 것입니다. –

+1

나는 그가 목록과 내부의 대상들을 깊이 복제하려한다고 생각한다. –

+1

Don - stackoverflow에 오신 것을 환영합니다. 언제나 자세한 질문을 게시하고 자신의 질문을 다시 읽는 데 도움이됩니다. 당신이 당신 자신의 질문에 대답 할 척하십시오. 낯선 사람이 내가 묻는 것을 이해하기까지 충분한 정보가 있는지 물어보십시오. – JonH

답변

3
당신이 lTest 값의 초기 설정을 포함시킬 모두의 끝에 그래서

lRet 그 초기 값을 포함하지만, 필터링의 비트와 함께 적용합니다? 문제는 참조를 다루는 것이므로 궁극적으로 모든 것이 같은 목록을 가리키고 있습니다. 난 당신이 아마 값을 assinging 대신 lRet에 목록 클래스의 AddRange (IEnumerable을 목록) 방법을 사용하는 것이 좋습니다 생각

List<Test> lRet = AddMore2Test(lTest.ToList());

+0

+1 - 나는 그 질문을 이해할 수 없었지만, 다른 누군가가했던 일은 어떻게 저를 넘어선 것입니까. :) – JonH

+0

하지만 AddMore2Test가 List를 반환하기 때문에 내 대답은 실제로 작동하지 않습니다. 그리고 그는 LINQ를 사용하고 있습니다. IEnumerable LINQ에서 ToList()를 호출해야하므로 두 개의 별개 목록이 이미 있어야합니다. –

+0

lTest.ToList()를 전달하면 원하는 간단한 목록을 얻을 수 있습니다. lRet과 lTest는 같은 목록을 가리 키지 않는 것 같습니다. 그러나 lRet의 항목에서 일부 필드를 변경 한 후에 lTest의 해당 필드도 같은 값으로 변경됩니다. lRet과 lTest의 밑에있는 각 아이템은 여전히 ​​서로를 가리 킵니까? 그렇다면이 문제를 해결하는 방법은 무엇입니까? – Don

2

을 : 빠른, 간단한 수정은이 작업을 수행하는 것입니다 :

lRet.AddRange(AddMore2Test(lTest)) 

편집 :

: 코멘트에이 lRet가 아직 초기화되지 않은 것을 지적했다, 그래서 여기에 가능한 변화
+0

lRet은 초기화되지 않았으므로 메서드에 대한 메서드를 호출 할 수 없습니다. 하지만 그는'lRet = new List (lTest); lRet.AddRange (AddMore2Test (lTest)); ' –

+0

ahh 네 좋은 캐치. 더 컴팩트 한 것이 lRet = new List (AddMore2Test (lTest)); 그래도 읽을 수있는 것은 아닙니다. –

관련 문제