使用C#泛型检索基于列值的最常见元素

3
我有下面的代码,从PetsAgeDataTable中检索最常见的成熟度。我已经让这段代码工作了,但我需要在另一列上执行同样的操作。因此,我需要将其通用化,并传递一个lambda表达式,以便可以重复使用。我花了太多时间尝试弄清楚它,请问是否有人能够友好地告诉我如何做...感谢/Jan Jensen
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个回答

1

假设你的方法接受一个lambda表达式:

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)。您无法真正返回匿名类型,但需要返回一些内容。在这里,我选择了一个Tuple,但是您有很多选项,具体取决于您打算如何使用它。

是的,但分组中的成熟度列不是通用的。怎么做呢?这里可能需要使用另一列。 - Jan
@Jan - 看看更新,现在应该可以编译了。:)。你可能会遇到 data != null 的问题,可以使用 default(T) 代替,或将该值作为参数。 - Kobi
我的代码目前还没有使用c# 4.0(我们将在几个月内升级 :)),那么除了元组之外,我还有什么其他选择? - Jan
@Jan - 你可以使用 KeyValuePair,而且编写一个简单的元组也不难。另一个选项是返回 T,并将计数作为 out 参数。 - Kobi
现在有两个问题... 我的编译器报错 let 关键字,另外你能否提供一个返回类型为 <T> 的示例? - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接