正在c#中的List中尝试GroupBy
本文关键字:GroupBy List 中的 正在 | 更新日期: 2023-09-27 18:25:17
在下面的例子中,我想得到员工重复的次数。例如,如果列表有25次EmpA,我想得到它。我正在尝试GroupBy,但没有得到结果。我可以跳过记录并找到计数,但有很多记录。
所以在下面的例子中,lineEmpNrs是列表,我希望按照员工ID对结果进行分组。
请提出建议。
public static string ReadLines(StreamReader input)
{
string line;
while ( (line = input.ReadLine()) != null)
yield return line;
}
private taMibMsftEmpDetails BuildLine(string EmpId, string EmpName, String ExpnsDate)
{
taMibMsftEmpDetails empSlNr = new taMibMsftEmpDetails();
empSlNr.EmployeeId = EmpId;
empSlNr.EmployeeName = EmpName;
empSlNr.ExpenseDate = ExpnsDate;
return empSlNr;
}
List<taMibMsftEmpDetails> lineEmpNrs = new List<taMibMsftEmpDetails>();
foreach (string line in ReadLines(HeaderFile))
{
headerFields = line.Split(',');
lineEmpNrs.Add(BuildLine(headerFields[1],headerFields[2],headerFields[3]));
}
您可以定义以下委托,用于从列表元素中选择分组键。它匹配任何接受一个参数并返回一些值(键值)的方法:
public delegate TResult Func<T, TResult>(T arg);
下面的通用方法,它将把任何列表转换为分组项目的字典
public static Dictionary<TKey, List<T>> ToDictionary<T, TKey>(
List<T> source, Func<T, TKey> keySelector)
{
Dictionary<TKey, List<T>> result = new Dictionary<TKey, List<T>>();
foreach (T item in source)
{
TKey key = keySelector(item);
if (!result.ContainsKey(key))
result[key] = new List<T>();
result[key].Add(item);
}
return result;
}
现在,您可以根据列表项的任何属性将任何列表分组到字典中:
List<taMibMsftEmpDetails> lineEmpNrs = new List<taMibMsftEmpDetails>();
// we are grouping by EmployeeId here
Func<taMibMsftEmpDetails, int> keySelector =
delegate(taMibMsftEmpDetails emp) { return emp.EmployeeId; };
Dictionary<int, List<taMibMsftEmpDetails>> groupedEmployees =
ToDictionary(lineEmpNrs, keySelector);
GroupBy
应该可以工作,如果你这样使用它:
var foo = lineEmpNrs.GroupBy(e => e.Id);
如果您想获得指定ID的所有员工的枚举表:
var list = lineEmpNrs.Where(e => e.Id == 1); // Or whatever employee ID you want to match
将两者结合起来应该会得到你想要的结果。
如果您想查看每个员工有多少记录,可以使用GroupBy
作为:
foreach (var g in lineEmpNrs.GroupBy(e => e.Id))
{
Console.WriteLine("{0} records with Id '{1}'", g.Count(), g.Key);
}
然而,要简单地找出指定的Id
有多少记录,使用Where
可能更简单:
Console.WriteLine("{0} records with Id '{1}'", lineEmpNrs.Where(e => e.Id == id).Count(), id);