2013-07-26 27 views
0

在下面的情况下,我想要计算员工重复的次数。例如,如果列表中有25次EmpA,我希望得到它。我正在尝试与GroupBy,但没有得到结果。我可以做记录跳过并找到计数,但有很多记录。在C列表中尝试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])); 
} 
+0

您是否打算将此限制为.net 2.0? – Kevin

+0

这是一个旧的项目,它有2.0,它在生产。所以这就是我没有改变的原因。我会在下周把它移到3.5或更高。 – Anirudh

+0

你如何在.NET 2.0项目中使用LINQ的'GroupBy'? – aevitas

回答

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

结合使用这两种应该得到你,你之后的结果。

+0

- >我相信这适用于.net 2.0? – Anirudh

+0

- >只是为了测试Linq,我只是在试用3.5框架的新项目。所以我添加了'using system.linq',然后尝试使用上面的代码。在上面的例子中,我收到了有关“e”用法的错误。有什么我需要做的吗?谢谢..我真的想试试linq。 – Anirudh

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