2013-07-26 3 views
0

으로 시도하는 경우 아래 사례에서 직원이 반복하는 횟수를 확인하고 싶습니다. 예를 들어 목록에 EmpA가 25 번있는 경우 가져오고 싶습니다. 나는 GroupBy로 시도하고 있지만 결과를 얻지 못하고있다. 나는 기록을 건너 뛰고 수를 발견 할 수 있지만 많은 기록이있다.GroupBy를 List 내에서 C#

그래서 아래 예에서 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 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; 
} 

의 사전에있는 목록을 변환합니다

public delegate TResult Func<T, TResult>(T arg); 

그리고 다음과 같은 일반적인 방법에있어서, 그것은 몇 가지 값을 하나 개의 인수를 받아 들여 반환하는 모든 방법 (키 값)과 일치 목록 항목의 속성에 따라 임의의 목록을 사전으로 그룹화 할 수 있습니다.

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

두 가지를 결합하는 것은 당신이 뒤에있는 결과를 얻을 수 있습니다. 당신이 GroupBy을 사용할 수 있습니다

+0

-> 나는 이것이 .net 2.0에서 작동한다고 생각하니? – Anirudh

+0

-> 그냥 Linq 테스트, 난 그냥 3.5 프레임 워크를 가지고 새로운 프로젝트에 노력하고 있어요. 그래서 'using system.linq'를 추가 한 다음 위의 행을 사용하려고했습니다. 위의 예에서 "e"사용과 관련된 오류가 발생합니다.내가해야 할 일이 있습니까? 고마워. 나는 정말로 linq를 시험해보고 싶다. – Anirudh

1

각 직원과 거기에 얼마나 많은 기록을보고 싶어하는 경우 :

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