2014-02-28 3 views
0

속으로 두 목록을 병합 :2 목록을 다음과 같이 내가 가진 하나

var selectedItems = _uow.ProductItems.Get(w => w.ProductId == productid).Select(projection => new 
{ 
    ProductId = projection.ProductId, 
    ProductItemId = projection.ProductItemId, 
    ProductItemTypeId = projection.ProductItemTypeId, 
    ProductItemName = GetItemName(projection), 
    ProductItemType = projection.ItemType, 
    Amount = projection.Amount 
}); 

var services = _uow.Services.GetAll().Select(projection => new { 
    ProductId = 0, 
    ProductItemId = 0, 
    ProductItemTypeId = projection.ServiceId, 
    ProductItemName = projection.Name, 
    ProductItemType = "Service", 
    Amount = projection.DefaultAmount 
}); 

내가 내 사용자 지정 논리를 사용하여 Linq를 사용하여 하나의리스트로 병합 할 수 있도록 할 만 객체 ProductItemTypeId을 경우를 유지하는 것입니다 일치하는 경우 ProductId 또는 ProductItemId아니요0입니다. 나는 다음과 같은 foreach를 사용하지만이를 달성했다 : 사람이 내 코드를보다 간결 너무 Linq에 위의 논리를 작성하는 방법을 제안 할 수 있다면 정말 감사하겠습니다

List<dynamic> productItems = new List<dynamic>(); 
foreach (var item in services) 
{ 
    if (item.ProductItemTypeId == selectedItems.Select(s => s.ProductItemTypeId).FirstOrDefault()) 
    { 
     productItems.Add(selectedItems.Where(w => w.ProductItemTypeId == item.ProductItemTypeId).FirstOrDefault());  
    } 
    else 
    { 
     productItems.Add(item); 
    } 
} 

.

+5

그냥 어둠 속에서, 어쩌면 당신은 시도 할 수 있습니다 [연합] (http://msdn.microsoft.com/en-us/library/bb341731%28v=vs.110%29.aspx) – jacqijvv

+0

확인 이 아웃 : http://stackoverflow.com/questions/21951459/merge-two-or-more-list-according-to-order/21951484#21951484 –

+0

@Noobacode 귀하의 의견을 보내 주셔서 감사하지만 아래에 내 의견을 참조하십시오'우편 번호 ' – lbrahim

답변

0

: 이런 식으로 뭔가를 시도

:

List<dynamic> productItems = new List<dynamic>(); 
foreach (var item in services) 
{ 
    if (item.ProductItemTypeId == selectedItems.Select(s => s.ProductItemTypeId).FirstOrDefault()) 
    { 
     productItems.Add(selectedItems.Where(w => w.ProductItemTypeId == item.ProductItemTypeId).FirstOrDefault());  
    } 
    else 
    { 
     productItems.Add(item); 
    } 
} 

대신 left join을 사용할 수 있습니다

var query = (from service in services 
      join item in selectedItems 
       on service.ProductItemTypeId equals item.ProductItemTypeId 
       into joinedList 
      from item in joinedList.DefaultIfEmpty() 
      select new 
      { 
       ProductId = item != null ? item.ProductId : service.ProductId, 
       ProductItemId = item != null ? item.ProductItemId : service.ProductItemId, 
       ProductItemTypeId = item != null ? item.ProductItemTypeId : service.ProductItemTypeId, 
       ProductItemName = item != null ? item.ProductItemName : service.ProductItemName, 
       ProductItemType = item != null ? item.ProductItemType : service.ProductItemType, 
       Amount = item != null ? item.Amount : service.Amount 
      }) 
      .ToList(); 
1

Linq와 함께 Zip을 사용할 수 있습니다.

Enumerable.Zip<TFirst, TSecond, TResult> 

이렇게하면 두 합집합의 새 목록이 생성됩니다.

http://msdn.microsoft.com/es-es/library/dd267698(v=vs.110).aspx

난이 도움이 되었으면 좋겠

편집 :이에 따라

var listResult = list1.Where(x => x.ProductId == 0 || x.ProductItemId == 0).Concat(list2.Where(x => x.ProductId == 0 || x.ProductItemId == 0)); 
+0

답변 해 주셔서 감사합니다. 그러나'Zip'은 숫자가 일치하지 않으면 목록에 객체를 남깁니다. 병합하려고하는 목록의 개체 수가 서로 다를 수 있습니다. – lbrahim

+0

내 대답을 편집합니다;) –

관련 문제