按具有相同值的标题和详细信息列表进行分组

  • 本文关键字:列表 详细信息 标题 c# linq
  • 更新时间 :
  • 英文 :


我有这个模型:

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);
}
}

相关内容

最新更新