0

在以下情况下,我想计算员工重复的次数。例如,如果列表中有 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]));
}
4

3 回答 3

2

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

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);
于 2013-07-26T20:53:27.653 回答
1

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

将两者结合起来应该可以得到你想要的结果。

于 2013-07-26T20:24:48.613 回答
1

如果您想查看每个员工有多少条记录,您可以使用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);
于 2013-07-26T20:28:50.280 回答