我有三个这样的模型:
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;}
}
现在当我得到结果时,我得到了章节和项目列表,并希望将这两个列表合并到上面的模型中。
所有内容都与部分ID相关联;确定项目在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 :(得分: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()
});
我分两步完成了这项工作,但如果可读性无关紧要(总是如此),你可以在一个步骤中完成。
一旦你知道这些方法,它就非常简单,但基本上我将所有的子部分和项目放在一起,然后我将所有的部分和子部分放在一起,然后我将所有的部分和子部分和项目放在一起。 / p>
请注意,任何孤立的项目或子项目(即那些没有SectionId
的部分或子部分的项目或子项目都将被抛弃)。但无论如何,那是关系不好的,所以这是可以接受的,据我所知。
答案 1 :(得分: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