2014-06-16 4 views
1

나는 이와 같은 코드를 가지고 있습니다.Linq를 사용하여 목록에 병합

public class Employee 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public string NickName { get; set; } 
} 

var table1 = new List<Employee>() { 
       new Employee(){ ID=1, Name="A"}, 
       new Employee(){ ID=2, Name="B"}, 
       new Employee(){ ID=3, Name="C"}, 
       new Employee(){ ID=5, Name="E"}, 
      }; 
var table2 = new List<Employee>() { 
       new Employee(){ ID=1, NickName="NickA"}, 
       new Employee(){ ID=2, NickName="NickB"}, 
       new Employee(){ ID=3, NickName="NickC"}, 
       new Employee(){ ID=4, NickName="NickD"} 
      }; 

나는 이런 일에 위의 두 목록을 병합 할 : 나는 LINQ를 사용하여 할 수있는 방법

{ID=1, Name="A", NickName="NickA"} 
{ID=2, Name="B", NickName="NickB"} 
{ID=3, Name="C", NickName="NickC"} 
{ID=4, Name=null, NickName="NickD"} 
{ID=5, Name="E", NickName=null} 

합니다. 제발 도와주세요!

답변

1

당신은 그룹 ID으로 할 수 있으며, 다음과 같이 각 필드에 값 "의 첫번째"를 선택 :이 방법을 가지고가는 경우에 그것이 어떤 테이블 Name 또는에서 중요하지 않습니다

var res = table1.Concat(table2).GroupBy(e => e.ID) 
    .Select(g => new Employee { 
     ID = g.Key 
    , Name = g.Select(e => e.Name).FirstOrDefault(s => s != null) 
    , NickName = g.Select(e => NickName).FirstOrDefault(s => s != null) 
    }); 

NickName : 목록에 과제를 혼합하여 LINQ가 다시 그룹화하도록 할 수 있습니다.

+0

''Concat''은 어떨까요 ?? –

+0

@EhsanSajjad 제 대답은 이미 첫 번째 단계로 'Concat'을 사용합니다. – dasblinkenlight

+0

매우 빨리 답변 해 주셔서 감사합니다 @ dasblinkenlight – Phillip

1

뭔가 같은 : (. 즉, 성능 측정) table2이 (수만 수천 개의 항목 이상)을 고려 충분히 큰

var results = table1.Select(t1 => { 
       var t2 = table2.First(x => x.ID == t1.ID); 
       return new Employee { 
        ID = t1.ID, 
        Name = t1.Name, 
        NickName = t2.NickName 
       }; 
       }).ToList(); 

경우에 (A Dictionary 또는 ID에 의해 빠른 검색을 제공하기 위해 배열을 정렬 구축 후자의 경우 BinarySearch 메서드를 사용하여 사용자 정의 IComparer과 ID 만 비교). 이 중간 구조를 설정하는 비용은 중요하지 않으며 최신 컴퓨터는 수천 개의 간단한 행을 매우 빠르게 검색 할 수 있습니다.

+0

약''Concat'' ?? 이 경우에는 작동할까요? –

+0

@EhsanSajjad 예, 가능합니다. 이런 종류의 문제에는 많은 접근법이 있습니다. 개인적으로 가능한 가장 단순한 방법을 사용하고 성능 요구 사항을 충족시키지 못하면 수정합니다. – Richard

관련 문제