programing

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

mailnote 2023. 5. 11. 21:42
반응형

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

내가 가지고 있는 경우:

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();,myList14개의 문자열이 포함되어 있고, 모든 문자열이 null이 아닌지 확인하기 위해 더하기 버튼을 눌렀습니다.

끝나고myList2 = getMeAnotherList();,myList26개의 문자열이 들어있고, 그것들이 null이 아닌지 확인했습니다.끝나고myList1.Concat(myList2);myList1에는 4개의 문자열만 포함되어 있습니다.왜 그런 것일까요?

Concat원래 목록을 수정하지 않고시퀀스를 반환합니다.해라myList1.AddRange(myList2).

사용해 보십시오.

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

Concat은 IEnumber를 반환합니다.<두 개의 목록을 합친 것입니다. 기존 목록을 수정하지 않습니다.또한 IEnumberable을 반환하므로 List<T> 변수에 할당하려면 IEnumberable의 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();

언급URL : https://stackoverflow.com/questions/1042219/how-do-you-concatenate-lists-in-c

반응형