2016-04-29 6 views
0

у меня есть два списка этого класса, например List1, List2Объединение двух списков и перезаписи некоторых значений

public class SearchCriteriaOption 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
    public string description { get; set; } 
    public bool selected { get; set; } 
    public bool required { get; set; } 
    public int sortOrder { get; set; } 
} 

List1 всегда имеет равные или более элементов в нем, чем List2. List2 в значительной степени является подмножеством List1

Первичным ключом является «id».

Я хочу создать третий список из этих двух списков таким образом, что она будет иметь все пункты List1НО для элементов, которые имеют тот же идентификатор в обеих списках, используйте значение свойств от List1КРОМЕ для выбрано и "sortOrder" property, use List2 для этого. Я не могу придумать, как начать это. Поэтому мне нужна помощь.

+0

Я бы предложил Linq и есть хорошая почта, которая объяснит, как присоединиться к спискам. http://stackoverflow.com/questions/2723985/linq-join-2-listts и вот еще одно сообщение, в котором приведены более подробные сведения об использовании свойств обоих для создания нового объекта. http://stackoverflow.com/questions/6253656/how-do-i-join-two-lists-using-linq-or-lambda-expressions – Mikanikal

ответ

2
var List3 = List1 
    .GroupJoin(List2, 
     o1 => o1.id, o2 => o2.id, 
     (option1, option2) => new { option1, option2 }) 
    .SelectMany(
     x => x.option2.DefaultIfEmpty(), 
     (x, option2) => new SearchCriteriaOption 
     { 
      // use most properties from list1 
      id = x.option1.id, 
      description = x.option1.description, 
      name = x.option1.name, 
      required = x.option1.required, 

      // using list2 for selected and sortOrder if available 
      // (if you cant use C# 6 syntax, use the next 2 lines) 
      //selected = option2 != null ? option2.selected : x.option1.selected, 
      //sortOrder = option2 != null ? option2.sortOrder : x.option1.sortOrder, 
      selected = option2?.selected ?? x.option1.selected, 
      sortOrder = option2?.sortOrder ?? x.option1.sortOrder, 
     }) 
    .ToList(); 
+0

Должен ли он быть Союзом или Присоединиться? Потому что в этом примере у меня есть 2 элемента в моем списке3, но у меня должно получиться 10 элементов, потому что у моего основного списка, который есть List1, было 10 элементов, у моего меньшего List2 было 2 элемента. – Bohn

+1

Извините, я прочитал, что вы хотели создать третий список «для элементов, имеющих одинаковый идентификатор в обоих списках». Мой плохой, я исправлю это. – Xiaoy312

+1

@Bohn Я изменил внутреннее соединение слева налево – Xiaoy312

Смежные вопросы