我需要對串列中的專案進行分組,然后將每個組傳遞給一個函式以進行進一步闡述。這是我的代碼:
var list = new List<MyObj>(); // list is created ad populated elsewhere in code...
var query = list.AsEnumerable();
query = query.Where(x => x.MyProp == true).Select(x => x); // query definition is way more complicated
var grp = query.GroupBy(x => new { x.Name, x.Surname }).ToList();
這里grp是型別List<IGrouping<'a, MyObj>>。
我可以通過以下方式輕松遍歷我的專案:
foreach (var g in grp)
{
foreach (var o in g)
{
// here "o" is of type MyObj
}
}
但我不知道如何創建一個接收組并遍歷其專案的函式:
foreach (var g in grp)
{
DoSomethingWithGroup(g);
}
這是因為我在 grp 定義中有一個匿名型別(鍵)。
我試圖用自定義型別替換 Key 匿名型別:
private class GrpKey
{
public string Name { get; set; }
public string Surname { get; set; }
}
/* ... */
var grp = query.GroupBy(x => new GrpKey { Name = x.Name, Surname = x.Surname }).ToList();
這種方式 grp 是 typeList<IGrouping<MyGrpKey, MyObj>>而不是List<IGrouping<'a, MyObj>>.
然后我可以創建一個函式:
private void DoSomethingWithGroup(IGrouping<MyGrpKey, MyObj>) { /* ... */ }
不幸的是,這種分組方式不再起作用:grp 現在包含與源串列中的專案一樣多的組,每個組都有一個專案。
uj5u.com熱心網友回復:
而不是像您那樣指定您的方法:
private void DoSomethingWithGroup(IGrouping<MyGrpKey, MyObj>)
將鍵和元素分離到它們的 on 引數中
private void DoSomethingWithGroup<T>(T groupKey, IEnumerable<MyObj> entities)
通過此更改,您可以執行以下操作:
//Populate list with some dummy data
var list = new List<MyObj>()
{
new MyObj { Id = 1, MyProp = true, Name = "A", Surname = "B"},
new MyObj { Id = 2, MyProp = false, Name = "A", Surname = "B"},
new MyObj { Id = 3, MyProp = true, Name = "B", Surname = "B"},
new MyObj { Id = 4, MyProp = true, Name = "B", Surname = "B"},
new MyObj { Id = 5, MyProp = true, Name = "C", Surname = "B"},
};
//Perform the grouping
var groups = list
.Where(x => x.MyProp)
.GroupBy(x => new { x.Name, x.Surname })
.ToList();
//Perform some arbitrary action on the group basis
foreach (var group in groups)
{
DoSomethingWithGroup(group.Key, group);
}
如果實作DoSomethignWithGroup看起來像這樣:
void DoSomethingWithGroup<T>(T groupKey, IEnumerable<MyObj> entities)
{
Console.WriteLine(groupKey);
foreach (var entity in entities)
{
Console.WriteLine($"- {entity.Id}");
}
}
那么輸出將是這樣的:
{ Name = A, Surname = B }
- 1
{ Name = B, Surname = B }
- 3
- 4
{ Name = C, Surname = B }
- 5
DotnetFiddle 鏈接
uj5u.com熱心網友回復:
如果您的函式中不需要密鑰,您可以在方法中省略它。AIGrouping<TKey, TElement>是一個IEnumerable<TElement>,因此您可以將其定義為:
private void DoSomethingWithGroup(IEnumerable<MyObj> items)
{
///...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494214.html
上一篇:C#.Netwhere條件
