2016-02-09 2 views
0

У меня есть три модели что-то вроде этого:Объединить два списка с помощью Linq

public class Section 
{ 
    public string Id {get; set;} 

    public SubSection[] SubSections {get; set;} 

    public Item[] Items {get; set;} 
} 

public class SubSection 
{ 
    public string Id {get; set;} 

    public string sectionId {get; set;} 

    public Item[] Items {get; set;} 
} 

public class Item 
{ 
    public string Id {get; set;} 

    public string sectionId {get; set;} 
} 

Теперь, когда я получаю результат обратно я возвращаюсь список разделов и предметов, и хотел бы объединить эти два списка, чтобы поместить его в вышеупомянутые модели.

Все связано с идентификатором секции; определяя, где элемент находится в разделе SubSection или непосредственно по разделу, и подразделы идут по массиву разделов.

Есть ли хороший способ сделать это с помощью Linq?

Пример:

Item { id = "123", sectionId = "456"} 
Item {id = "234", sectionId = "786"} 

SubSection {id = "211", sectionId = "786", Items = null} 
SubSection {id = "210", sectionId = 456", Items[] = new Item() {"123"}} 

Section {id = 786, subsections[] = null, items[] = new Item() {"234" }} 
Section {id = 456, subsection[] = new SubSection { id = 210}, items = null} 
+0

«Теперь, когда я получаю результат назад» ... Как вы его получите? Это через веб-API? Вызов ORM? Сбор в памяти? – krillgar

+2

Определить «слияние» ... –

+0

Да, его из веб-API и он возвращается как IList itemList и IList

раздел Список -> Внутренне даже SubSection рассматривается как раздел ... – user1932923

ответ

1

LINQ хорош при чтении и трансформации, но не на изменение пунктов, где они стоят. Это выполнимо (правильный путь и «неправильный» способ), но если вам это специально не нужно, я сосредоточусь на том, что вы здесь задаете.

List<SectionWithoutCollections> sections; 
List<SubSectionWithoutCollections> subSections; 
List<Item> items; 

var subSectionsWithItems = subSections 
    .GroupJoin(items, a => a.Id, b => b.SectionId, (a,b) => new SubSection 
       { 
        Id = a.Id, 
        SectionId = a.SectionId, 
        Items = b.ToArray() 
       }); 

var sectionsWithItems = sections 
    .GroupJoin(subSectionsWithItems, a => a.Id, b => b.SectionId, (a,b) => new { Section = a, SubSections = b }) 
    .GroupJoin(items, a => a.Section.Id, b => b.SectionId, (a,b) => new Section 
       { 
        Id = a.Section.Id, 
        Items = b.ToArray(), 
        SubSections = a.SubSections.ToArray() 
       }); 

Я сделал это в два этапа, но вы можете сделать это в одном, если читаемость не имеет значения (которое всегда делает).

Это довольно прямолинейно, как только вы знаете методы, но в основном я поставил все подразделы и элементы вместе, затем я поместил все разделы и подразделы вместе, затем я поместил все разделы и подразделы и элементы вместе.

Просто отметьте, что любые потерянные элементы или подразделы (т. Е. Те, для которых нет раздела или подраздела с SectionId) будут выброшены. Но в любом случае это плохое отношение, так что это приемлемо, насколько я знаю.

0
var sections = new List<Section>(); 
     var subSections = new List<SubSection>(); 
     var items = new List<Item>(); 

     var itemSections = from s in sections 
          let i = items.Where(j => j.sectionId == s.Id).DefaultIfEmpty().ToArray() 
          let ss = subSections.Where(j => j.sectionId == s.Id).DefaultIfEmpty().ToArray() 

          select new Section 
          { 
           Id = s.Id, 
           SubSections = ss, 
           Items = i 
          }; 

Это должно работать, не проверено. Не уверен, что вы подразумеваете под Merge tho

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