2013-07-26 29 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);