2011-05-10 2 views
3

다음 코드는 PetsAgeDataTable에서 가장 일반적인 성숙도를 검색합니다. 이 코드는 작동하지만 다른 열에서 같은 트릭을 수행해야합니다. 따라서 일반화하고 람다 식을 전달하여 재사용 할 수 있어야합니다. 난 그냥 누군가가 나를 ... 건배/월 젠슨은 C# generics가있는 열 값을 기반으로 가장 일반적인 요소를 검색합니다.

var Petmaturity = from p in PetsAgeDataTable 
         where p.Maturity != null // 
         group p by new { p.Maturity, p.PetId } into gp 
        select new { Maturity = gp.Key.Maturity, Count = gp.Coeunt() }; 
var element= Petmaturity.OrderByDescending(s => s.Count).First() 

답변

1

이 방법을 가정하면 람다 걸리는 방법을 알려 주시기 친절하게도 될 것이다 묻는 거기를 내려고 너무 많은 시간을 소비하고 있습니다 :

Func<Pet, T> getData 

시도 뭔가 같은 :

public Tuple<T, int> GetMostCommonProperty<T>(IEnumerable<Pet> pets, 
               Func<Pet, T> getData) 
{ 
    var petGroups = from p in pets 
        let data = getData(p) 
        where data != null 
        group p by new { Data = data, p.PetId } into gp 
        select new { Data = gp.Key.Data, Count = gp.Count() }; 
    var element = petGroups.OrderByDescending(s => s.Count).First(); 

    return Tuple.Create(element.Data, element.Count); 
} 

샘플 사용 :

Tuple<string, int> mostCommonName = GetMostCommonProperty(PetsAgeDataTable, 
                  pet => pet.Name); 

여기에는 일반적인 반환 유형이 필요합니다 (항상 int이 아닌 경우). 익명 형식을 반환 할 수는 없지만 반환해야합니다. 여기에서 튜플을 선택했지만, 사용하려는 방법에 따라 많은 옵션이 있습니다.

+0

예. 그러나 그룹화의 성숙도 열은 genric이 아닙니다. 어떻게 할 수 있습니까? 여기서 다른 열이 될 수도 있습니다. – Jan

+0

@Jan - 업데이트를 확인하십시오. 이제 컴파일해야합니다. ':)'. 'data! = null'에 문제가있을 수 있습니다. 대신에'default (T)'를 사용하거나 값을 매개 변수로 사용할 수 있습니다. – Kobi

+0

이것은 정말로 문제를 해결합니다. 많은 감사 – Jan

관련 문제