正在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]));
}

正在c#中的List中尝试GroupBy

您可以定义以下委托,用于从列表元素中选择分组键。它匹配任何接受一个参数并返回一些值(键值)的方法:

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);
相关文章: