我有这个模型:
public class HeaderDetail
{
public Header Header { get; set}
public Detail Detail{ get; set}
}
以及包含具有相同值的标头的集合:
public IEnumerable = new List<HeaderDetail>
{
new HeaderDetail
{
new Header { HeaderID = 1, HeaderName = "One" },
new Detail { DetailID = 1, HeaderID = 1, DetailName = "DetailOne" }
},
new HeaderDetail
{
new Header { HeaderID = 1, HeaderName = "One" },
new Detail { DetailID = 2, HeaderID = 1, DetailName = "DetailTwo" }
},
new HeaderDetail
{
new Header { HeaderID = 2, HeaderName = "Two" },
new Detail { DetailID = 3, HeaderID = 2, DetailName = "DetailThree" }
},
}
现在,如何按标题对该列表进行分组,以免它们重复?新集合应具有如下模型:
public class HeaderDetails
{
public Header Header { get; set}
public IEnumerable<Detail> Details{ get; set}
}
您可以使用GroupBy(a => a.Header.HeaderName).Select(a=>a.FirstOrDefault())
对重复项进行分组和删除
var data = new List<HeaderDetail>()
{
new HeaderDetail
{
Header = new Header { HeaderID = 1, HeaderName = "One" },
Detail = new Detail { DetailID = 1, HeaderID = 1, DetailName = "DetailOne" }
},
new HeaderDetail
{
Header = new Header { HeaderID = 1, HeaderName = "One" },
Detail = new Detail { DetailID = 2, HeaderID = 1, DetailName = "DetailTwo" }
},
new HeaderDetail
{
Header = new Header { HeaderID = 2, HeaderName = "Two" },
Detail = new Detail { DetailID = 3, HeaderID = 2, DetailName = "DetailThree" }
}
};
var groupedByHeaderName = data.GroupBy(a => a.Header.HeaderName).Select(a=>a.FirstOrDefault());
或仅按标头名称分组:
var groupedByHeaderName = data.GroupBy(a => a.Header.HeaderName, (key, val) => new { HeaderName = key, Data = val.ToList() });
var results = list.GroupBy(
p => p.Header.HeaderName,
p => p.Detail,
(key, g) => new HeaderDetails { Header = new Header { HeaderName = key }, Details = g.ToList() });
foreach (var item in results)
{
Console.WriteLine(item.Header.HeaderName);
foreach (var det in item.Details)
{
Console.WriteLine(det.DetailName);
}
}