[C#] 두 목록을 함께 결합

string 유형 (또는 다른 유형)의 두 목록이있는 경우 두 목록을 결합하는 빠른 방법은 무엇입니까?

순서는 동일하게 유지되어야합니다. 중복은 제거해야합니다 (두 링크의 모든 항목은 고유하지만). 인터넷 검색을 할 때이 점을 많이 찾지 못했으며 전달 속도를 위해 .NET 인터페이스를 구현하고 싶지 않았습니다.



답변

시도해 볼 수 있습니다 :

List<string> a = new List<string>();
List<string> b = new List<string>();

a.AddRange(b);

에 대한 MSDN 페이지 AddRange

이렇게하면 목록의 순서가 유지되지만 중복되는 항목 Union은 제거되지 않습니다 .

이것은 list를 변경합니다 a. 원래 목록을 유지 Concat하려면 다른 답변에서 지적한대로 사용해야합니다 .

var newList = a.Concat(b);

이 다시 표시 IEnumerable장기로는 a널 (null)이 아닙니다.


답변

최소 공간 오버 헤드가있는 방법은 Concat 확장 방법을 사용하는 것입니다.

var combined = list1.Concat(list2);

IEnumerable<T>list1과 list2의 요소를 순서대로 열거 할 인스턴스를 만듭니다 .


답변

연합 (EU)의 방법은 당신의 요구를 충족 수 있습니다. 주문 또는 복제가 중요한지 여부를 지정하지 않았습니다.

두 개의 IEnumerable을 가져 와서 여기에 표시된 것처럼 합집합을 수행하십시오.

int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };

IEnumerable<int> union = ints1.Union(ints2);

// yields { 5, 3, 9, 7, 8, 6, 4, 1, 0 } 


답변

이 같은:

firstList.AddRange (secondList);

또는 System.Linq에 정의 된 ‘Union’확장 방법을 사용할 수 있습니다. ‘Union’을 사용하면 항목을 통합해야하는지 여부를 지정하는 데 사용할 수있는 비교자를 지정할 수도 있습니다.

이처럼 :

List<int> one = new List<int> { 1, 2, 3, 4, 5 };
List<int> second=new List<int> { 1, 2, 5, 6 };

var result = one.Union (second, new EqComparer ());

foreach( int x in result )
{
    Console.WriteLine (x);
}
Console.ReadLine ();

#region IEqualityComparer<int> Members
public class EqComparer : IEqualityComparer<int>
{
    public bool Equals( int x, int y )
    {
        return x == y;
    }

    public int GetHashCode( int obj )
    {
        return obj.GetHashCode ();
    }
}
#endregion


답변

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

잘 작동하고 있다고 생각합니다. 앞서 언급했듯이 Concat은 새로운 시퀀스를 반환하고 결과를 List로 변환하는 동안 완벽하게 작동합니다. AddRange 메서드를 사용할 때 암시 적 변환이 실패 할 수 있습니다.


답변

목록에 일부 항목이 있으면 사용할 수 있습니다

var all = list1.Concat(list2).Concat(list3) ... Concat(listN).Distinct().ToList();


답변

그것들이 같은 타입이라면 AddRange를 사용하면 매우 간단합니다 :

list2.AddRange(list1);