C#에서 목록을 어떻게 연결합니까?
-
22-07-2019 - |
문제
만약 내가 가지고 있다면:
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
4 개의 문자열이 포함되어 있으며 플러스 버튼을 눌러 모든 널이 아닌지 확인했습니다.
후에 myList2 = getMeAnotherList();
, myList2
6 개의 끈이 들어 있고, 나는 그들이 널 있지 않은지 확인했는지 확인했다. myList1.Concat(myList2);
MyList1에는 4 개의 줄만 포함되어 있습니다. 왜 그런 겁니까?
해결책
Concat
새로운 시퀀스를 반환합니다 원래 목록을 수정하지 않고. 노력하다 myList1.AddRange(myList2)
.
다른 팁
이 시도:
myList1 = myList1.Concat(myList2).ToList();
동의 ienumerable을 반환합니다u003CT> 이것이 두 목록이 구성되어 있으며 기존 목록을 수정하지 않습니다. 또한 ienumerable을 반환하기 때문에 목록 인 변수에 할당하려면u003CT> , 당신은 ienumerable에서 tolist ()를 호출해야합니다.u003CT> 반환됩니다.
targetList = list1.Concat(list2).ToList();
잘 작동합니다. 앞서 말했듯이, Cocat은 새로운 시퀀스를 반환하고 결과를 나열하도록 변환하는 동안 작업을 완벽하게 수행합니다.
또한 일정한 시간과 일정한 기억으로 연결되는 것은 또한 주목할 가치가 있습니다. 예를 들어 다음 코드입니다
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
나는 이것이 늙었다는 것을 알고 있지만 나는이 게시물에 빠르게 내 대답이 될 것이라고 생각했다. Union은 나를 위해 훌륭하게 일했습니다. 참고, 그것은 고유 한 값 만 반환하지만 어쨌든이 솔루션이 저에게 효과가있는 고유 한 값을 얻고 있다는 것을 알고 있습니다.
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
내 구현을 살펴보십시오 its safe from null lists
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();