如何在 C# 串列中的兩個屬性上撰寫分組依據。我有這樣的清單。

在附圖中,我在一個串列中有資料,并期望得到如圖所示的結果。
我嘗試了類似這樣的代碼。
var result = EmpList
.GroupBy(x => x.Dept && x.Area)
.Select(c => new { Key = c.Key, total = c.Count() });
但無法正確檢索資料。
uj5u.com熱心網友回復:
您可以按匿名型別分組。例如:
var result = EmpList.GroupBy(x => new { x.Dept, x.Area })
.Select(g => new { Key = g.Key, Total = g.Count() });
在每個結果中,Key屬性將是匿名型別,因此您可以使用x.Key.Dept和x.Key.Area。
請注意,您也可以按照 snr 的建議使用值元組來執行此操作。使用查詢運算式或“方法語法”的選擇與使用匿名型別或值元組的選擇完全正交。例如,使用上面的值元組將是:
var result = EmpList.GroupBy(x => (x.Dept, x.Area))
.Select(g => (g.Key, Total: g.Count()));
uj5u.com熱心網友回復:
如果您使用相同或更高版本的 C# 7.1,您也可以這樣做
var result =
from x in EmpList
group x by (
x.Area, x.Dept
) into c
select (
Total : c.Count(), Key : c.Key
);
uj5u.com熱心網友回復:
如果您想列出所有可能的組合并獲取資料串列中沒有任何匹配的組合的計數(如螢屏截圖所示),您可以先提取所有部門和區域,然后創建所有可能的組合(部門, area),然后計算資料串列中的關聯匹配項。
一種方法是:
// Extracting departments and areas from list
var departments = EmpList
.Select(data => data.Department)
.Distinct();
var areas = EmpList
.Select(data => data.Area)
.Distinct();
// Creating all possible combinations of department and area
IEnumerable<( Department Department, Area Area )> combinations = departments
.Aggregate(Enumerable.Empty<( Department, Area )>(),
( combos, department ) => combos.Concat(areas.Select(area => ( department, area ))));
// Counting all matches found in the data list for each combination
IEnumerable<( string Combination, int Count )> combinationCount = combinations
.GroupJoin(EmpList,
combination => combination,
data => ( data.Department, data.Area ),
( combination, dataMatches ) => ( $"{combination.Department}-{combination.Area}", dataMatches.Count() ));
Console.WriteLine(string.Join(Environment.NewLine, combinationCount));
在這里,我使用命名元組變數來存盤資料。( string Combination, int Count )是一個具有兩個資料成員的元組:(Combination型別string)和Count(型別int)。
.Aggregate()和.GroupJoin()也用于生成所有可能的部門/區域組合,并分別計算每個組合的匹配項。
我也假設Department并且Area都是列舉型別:
public enum Department
{
Undefined,
Audit,
DEV,
Finance,
Marketing
}
public enum Area
{
Undefined,
ATNR,
DSNR,
NTGR
}
,但它們也可以是純字串。(如果它們實際上是字串,請告訴我,我會相應地調整代碼。)
如果Department并且Area真的是列舉,并且您想要所有可能的部門/區域組合,即使對于您的 中根本沒有提到的部門/區域EmpList,您可以從填充departments并areas直接從相應的列舉型別中受益,而不是遍歷EmpList多次:
// Getting all existing departments and areas
var departments = Enum.GetValues<Department>().Where(d => d != default);
var areas = Enum.GetValues<Area>().Where(a => a != default);
(但是,這種方式不會反映您的出現順序EmpList)。
示例小提琴在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/428900.html
下一篇:如何使用三個集合制作一個集合?
