[英]Group and count list of list items
考慮以下內容:
public class Board
{
public List<Component> Components { get; set; }
}
public class Component
{
public int Id { get; set; }
public string Name { get; set; }
}
var data = new[]{
new Board{
Components = new List<Component> {
new Component{Id = 1, Name= "Item 1"},
new Component{Id = 2, Name= "Item 2"}
}
},
new Board{
Components = new List<Component> {
new Component{Id = 1, Name= "Item 1"},
new Component{Id = 3, Name= "Item 3"}
}
},
new Board{
Components = new List<Component> {
new Component{Id = 2, Name= "Item 2"},
new Component{Id = 1, Name= "Item 1"}
}
},
new Board{
Components = new List<Component> {
new Component{Id = 1, Name= "Item 1"},
new Component{Id = 2, Name= "Item 2"},
new Component{Id = 3, Name= "Item 3"}
}
},
};
由此,我需要獲得2個列表:一個包含某個特定組件在所有Board中出現的次數,另一個包含該特定組件在一個Board中一起使用了多少次的列表。
我使用的第一個:
var componentsCount = data.SelectMany(x => x.Components)
.GroupBy(x => x.Id)
.Select(x => new { Item = x.First(), Count = x.Count() });
第二個是我的問題,結果應該是這樣的:
[
{Count = 2, Components = [{ Id = 1, Name = "Item 1"}, { Id = 2, Name = "Item 2"}]}
{Count = 1, Components = [{ Id = 1, Name = "Item 1"}, { Id = 3, Name = "Item 3"}]}
{Count = 1, Components = [{ Id = 1, Name = "Item 1"}, { Id = 2, Name = "Item 2"}, { Id = 3, Name = "Item 3"}]}
]
但是即使開始,我也很難。 LINQ是否有可能,還是我應該求助於foreach和手動比較? 關於如何實現這一點的任何提示?
您需要根據組件對數據列表進行分組。 您需要實現IEqualityComparer
,該IEqualityComparer
會根據Components
的Id
比較您的列表:
class ComponentListComparer : IEqualityComparer<List<Component>>
{
public bool Equals(List<Component> x, List<Component> y)
{
return x.Select(c => c.Id)
.OrderBy(c => c)
.SequenceEqual(y.Select(c => c.Id).OrderBy(c => c));
}
public int GetHashCode(List<Component> obj)
{
return obj.Select(x => x.Id.GetHashCode() * 23).Sum();
}
}
然后將其傳遞給GroupBy
:
var result = data.GroupBy(x => x.Components, new ComponentListComparer())
.Select(g => new {Count = g.Count(), Components = g.Key})
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.