C #에서 목록을 어떻게 연결합니까? 가지고 있다면: List<string> myList1; List<string> myList2; myList1

만약 내가 가지고 있다면:

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이 네 개의 문자열이 포함되어 있습니다. 왜 그런 겁니까?



답변

Concat원본 목록을 수정하지 않고 새 시퀀스 반환 합니다 . 시도하십시오 myList1.AddRange(myList2).


답변

이 시도:

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

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


답변

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

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


답변

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


답변

나는 이것이 오래되었다는 것을 알고 있지만 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


답변

내 구현을 살펴보십시오. 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();


답변