C# 在c中尝试列表中的GroupBy

C# 在c中尝试列表中的GroupBy,c#,list,group-by,.net-2.0,ienumerable,C#,List,Group By,.net 2.0,Ienumerable,在下面的例子中,我想计算员工重复的次数。例如,如果列表有25次EmpA,我想得到它。我正在尝试GroupBy,但没有得到结果。我可以做记录跳过,并找到计数,但有很多记录 因此,在下面的示例中,lineEmpNrs是列表,我希望按员工ID对结果进行分组 请建议 public static string ReadLines(StreamReader input) { string line; while ( (line = input.ReadLine()) != null) yield re

在下面的例子中,我想计算员工重复的次数。例如,如果列表有25次EmpA,我想得到它。我正在尝试GroupBy,但没有得到结果。我可以做记录跳过,并找到计数,但有很多记录

因此,在下面的示例中,lineEmpNrs是列表,我希望按员工ID对结果进行分组

请建议

public static string ReadLines(StreamReader input)
{
string line;
while ( (line = input.ReadLine()) != null)
   yield return line;
}

}

如果您这样使用GroupBy,它应该可以工作:

var foo=linempnrs.GroupBye=>e.Id

如果您希望获得具有指定ID的所有员工的可枚举项:

var list=linempnrs.where e=>e.Id==1;//或者任何您想要匹配的员工ID

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

如果您这样使用GroupBy,它应该会起作用:

var foo=linempnrs.GroupBye=>e.Id

如果您希望获得具有指定ID的所有员工的可枚举项:

var list=linempnrs.where e=>e.Id==1;//或者任何您想要匹配的员工ID


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

如果您想查看每个员工的记录数量,您可以使用GroupBy作为:

但是,要简单地找出指定Id有多少条记录,使用Where可能更简单:


如果您想查看每个员工的记录数量,可以使用GroupBy作为:

但是,要简单地找出指定Id有多少条记录,使用Where可能更简单:


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

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);

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

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);

您是否打算将其限制为.NET2.0?这是一个有2.0版本的旧项目,正在生产中。这就是为什么我没有改变。下周我将把它移到3.5或更高版本。你如何在.NET 2.0项目中使用LINQ的GroupBy?@aevitas:我试图使用lineSerialNrs.GroupBy。我不想使用LINQ,因为我知道它在3.5版本中可用,如果我记得正确的话。Enumerable.GroupBy作为LINQ扩展方法的一部分添加到了.NET 3.5中,因此它不能与.NET 2.0一起使用。话虽如此,除非是明确的要求,否则没有理由坚持使用2.0。你会错过所有好东西的!您是否打算将其限制为.NET2.0?这是一个有2.0版本的旧项目,正在生产中。这就是为什么我没有改变。下周我将把它移到3.5或更高版本。你如何在.NET 2.0项目中使用LINQ的GroupBy?@aevitas:我试图使用lineSerialNrs.GroupBy。我不想使用LINQ,因为我知道它在3.5版本中可用,如果我记得正确的话。Enumerable.GroupBy作为LINQ扩展方法的一部分添加到了.NET 3.5中,因此它不能与.NET 2.0一起使用。话虽如此,除非是明确的要求,否则没有理由坚持使用2.0。你会错过所有好东西的!->为了测试Linq,我正在尝试使用3.5框架的新项目。所以我添加了“usingsystem.linq”,然后尝试使用上面的代码行。在上面的示例中,我得到了与e的使用相关的错误。有什么我需要做的吗?谢谢。我真的很想试试linq。->为了测试linq,我正在尝试一个新的项目,它有3.5框架。所以我添加了“usingsystem.linq”,然后尝试使用上面的代码行。在上面的示例中,我得到了与e的使用相关的错误。有什么我需要做的吗?谢谢。我真的很想试试林肯。
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);