C #에서 목록을 어떻게 연결합니까?


170

만약 내가 가지고 있다면:

List<string> myList1;
List<string> myList2;

myList1 = getMeAList();
// Checked myList1, it contains 4 strings

myList2 = getMeAnotherList();
// Checked myList2, it contains 6 strings

myList1.Concat(myList2);
// Checked mylist1, it contains 4 strings... why?

Visual Studio 2008에서 이와 비슷한 코드를 실행하고 각 실행 후 중단 점을 설정했습니다. 이후 myList1 = getMeAList();myList1네 개의 문자열이 포함되어 있으며 더하기 버튼을 눌러 모두 null이 아닌지 확인했습니다.

myList2 = getMeAnotherList();, myList26 문자열을 포함하고 난 후에는 반드시 그들이 ... 널 아니었다하게 확인 myList1.Concat(myList2);myList1이 네 개의 문자열이 포함되어 있습니다. 왜 그런 겁니까?

답변:



96

이 시도:

myList1 = myList1.Concat(myList2).ToList();

Concat 은 두 목록을 합친 IEnumerable <T>를 반환하며 기존 목록을 수정하지 않습니다. 또한 IEnumerable을 반환하므로 List <T> 인 변수에 할당하려면 반환 된 IEnumerable <T>에서 ToList ()를 호출해야합니다.


6
이제 질문을 다시 읽었으므로 .AddRange ()는 OP가 실제로 원하는 것과 비슷하게 들립니다.
Jonathan Rupp

@Kartiikeya 인수가 유효하지 않다고 말하는 경우 System.Linq에 대한 using 문이 없거나 그 중 하나가 아닙니다IEnumerable<T>
Jonathan Rupp

12
targetList = list1.Concat(list2).ToList();

잘 작동하고 있다고 생각합니다. 앞서 언급했듯이 Concat은 새로운 시퀀스를 반환하고 결과를 List로 변환하는 동안 완벽하게 작동합니다.


4

Concat은 일정한 시간과 일정한 메모리에서 작동한다는 점도 주목할 가치가 있습니다. 예를 들어, 다음 코드

        long boundary = 60000000;
        for (long i = 0; i < boundary; i++)
        {
            list1.Add(i);
            list2.Add(i);
        }
        var listConcat = list1.Concat(list2);
        var list = listConcat.ToList();
        list1.AddRange(list2);

다음 타이밍 / 메모리 메트릭을 제공합니다.

After lists filled mem used: 1048730 KB
concat two enumerables: 00:00:00.0023309 mem used: 1048730 KB
convert concat to list: 00:00:03.7430633 mem used: 2097307 KB
list1.AddRange(list2) : 00:00:00.8439870 mem used: 2621595 KB

2

나는 이것이 오래되었다는 것을 알고 있지만 Concat이 내 대답이라고 생각 하면서이 게시물을 빨리 왔습니다. 노동 조합은 저에게 큰 도움이되었습니다. 참고로, 유일한 값만 반환하지만 어쨌든이 솔루션이 저에게 효과적이라는 것을 알고 있습니다.

namespace TestProject
{
    public partial class Form1 :Form
    {
        public Form1()
        {
            InitializeComponent();

            List<string> FirstList = new List<string>();
            FirstList.Add("1234");
            FirstList.Add("4567");

            // In my code, I know I would not have this here but I put it in as a demonstration that it will not be in the secondList twice
            FirstList.Add("Three");  

            List<string> secondList = GetList(FirstList);            
            foreach (string item in secondList)
                Console.WriteLine(item);
        }

        private List<String> GetList(List<string> SortBy)
        {
            List<string> list = new List<string>();
            list.Add("One");
            list.Add("Two");
            list.Add("Three");

            list = list.Union(SortBy).ToList();

            return list;
        }
    }
}

출력은 다음과 같습니다.

One
Two
Three
1234
4567

2

내 구현을 살펴보십시오. null 목록에서 안전합니다.

 IList<string> all= new List<string>();

 if (letterForm.SecretaryPhone!=null)// first list may be null
     all=all.Concat(letterForm.SecretaryPhone).ToList();

 if (letterForm.EmployeePhone != null)// second list may be null
     all= all.Concat(letterForm.EmployeePhone).ToList(); 

 if (letterForm.DepartmentManagerName != null) // this is not list (its just string variable) so wrap it inside list then concat it 
     all = all.Concat(new []{letterForm.DepartmentManagerPhone}).ToList();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.