C# LINQ(模式)下的返回模式平均值

C# LINQ(模式)下的返回模式平均值,c#,linq,ienumerable,C#,Linq,Ienumerable,我不确定这里使用的CopyMost是否正确,但我的客户使用的是CopyMost数据协议。听起来他想要那种模式?我有一组数据: Increment Value .02 1 .04 1 .06 1 .08 2 .10 2 我需要返回哪个值出现的次数最多。在本例中,值为1。现在,我计划为IEnumerable编写一个扩展方法,以实现对整数值的扩展。Linq中有没有内置的东西可以轻松做到

我不确定这里使用的CopyMost是否正确,但我的客户使用的是CopyMost数据协议。听起来他想要那种模式?我有一组数据:

Increment    Value
.02            1
.04            1
.06            1
.08            2
.10            2
我需要返回哪个值出现的次数最多。在本例中,值为1。现在,我计划为IEnumerable编写一个扩展方法,以实现对整数值的扩展。Linq中有没有内置的东西可以轻松做到这一点?还是我最好编写一个类似这样的扩展方法

records.CopyMost(x => x.Value);
编辑

看起来我在寻找模态平均值。我已经提供了一个更新的答案,允许出现平局情况。它的意思是像这样使用,是通用的

records.CopyMost(x => x.Value, x => x == 0);

在这种情况下,x.值将是一个整数,如果0的计数与1和3的计数相同,则它将在0上断开连接。

好的,这里有一个选项:

var query = (from item in data
             group 1 by item.Value into g
             orderby g.Count() descending
             select g.Key).First();
基本上,我们使用GroupBy来按值分组,但我们对每个组感兴趣的是组的大小和键(即原始值)。我们按大小对组进行排序,并取第一个元素,即元素最多的元素


这有用吗?

好吧,这里有一个选项:

var query = (from item in data
             group 1 by item.Value into g
             orderby g.Count() descending
             select g.Key).First();
基本上,我们使用GroupBy来按值分组,但我们对每个组感兴趣的是组的大小和键(即原始值)。我们按大小对组进行排序,并取第一个元素,即元素最多的元素


这有帮助吗?

乔恩比我快,但你要找的术语是

编辑:

如果我认为你需要的是模态平均值,那么下面的方法应该可以做到:

var i = (from t in data
         group t by t.Value into aggr
         orderby aggr.Count() descending
         select aggr.Key).First();

乔恩抢在我前面,但你要找的术语是

编辑:

如果我认为你需要的是模态平均值,那么下面的方法应该可以做到:

var i = (from t in data
         group t by t.Value into aggr
         orderby aggr.Count() descending
         select aggr.Key).First();

多年来,我的代码中多次更新了此方法。它已经成为一种非常重要的方法,并且与过去大不相同。我想提供最新的版本,以防有人想添加CopyMost或modalaverage作为linq扩展

我认为我不需要的一件事是某种决胜局。现在,我重载了该方法以包含一个tiebreaker

public static K CopyMost<T, K>(this IEnumerable<T> records, Func<T, K> propertySelector, Func<K, bool> tieBreaker)
{
    var grouped = records.GroupBy(x => propertySelector(x)).Select(x => new { Group = x, Count = x.Count() });
    var maxCount = grouped.Max(x => x.Count);
    var subGroup = grouped.Where(x => x.Count == maxCount);

    if (subGroup.Count() == 1)
        return subGroup.Single().Group.Key;
    else
        return subGroup.Where(x => tieBreaker(x.Group.Key)).Single().Group.Key;
}
以上假设用户进入了合法的断开连接条件。您可能需要检查并查看tiebreaker是否返回有效值,如果没有,则抛出异常。这是我的常规方法

public static K CopyMost<T, K>(this IEnumerable<T> records, Func<T, K> propertySelector)
{
    return records.GroupBy(x => propertySelector(x)).OrderByDescending(x => x.Count()).Select(x => x.Key).First();
}

多年来,我的代码中多次更新了此方法。它已经成为一种非常重要的方法,并且与过去大不相同。我想提供最新的版本,以防有人想添加CopyMost或modalaverage作为linq扩展

我认为我不需要的一件事是某种决胜局。现在,我重载了该方法以包含一个tiebreaker

public static K CopyMost<T, K>(this IEnumerable<T> records, Func<T, K> propertySelector, Func<K, bool> tieBreaker)
{
    var grouped = records.GroupBy(x => propertySelector(x)).Select(x => new { Group = x, Count = x.Count() });
    var maxCount = grouped.Max(x => x.Count);
    var subGroup = grouped.Where(x => x.Count == maxCount);

    if (subGroup.Count() == 1)
        return subGroup.Single().Group.Key;
    else
        return subGroup.Where(x => tieBreaker(x.Group.Key)).Single().Group.Key;
}
以上假设用户进入了合法的断开连接条件。您可能需要检查并查看tiebreaker是否返回有效值,如果没有,则抛出异常。这是我的常规方法

public static K CopyMost<T, K>(this IEnumerable<T> records, Func<T, K> propertySelector)
{
    return records.GroupBy(x => propertySelector(x)).OrderByDescending(x => x.Count()).Select(x => x.Key).First();
}

这一切都有道理,除了1。按项目分组1。将值分为g。为什么是1?为什么不呢?我进行了测试,结果都是一样的。我知道出于某种原因1可能更好,但我想了解原因。@jsmith:只是为了表明您确实不关心组中的值。您甚至可以使用字节1来提高效率:那么,如果我使用另一个值,比如组2,会发生什么呢?@msarchet:什么都不会改变。我们不关心组中的值,只关心组的大小。他们可能是金鱼,因为这会对结果产生影响。这一切都是有意义的,除了1。按项目分组1。将值分为g。为什么是1?为什么不呢?我进行了测试,结果都是一样的。我知道出于某种原因1可能更好,但我想了解原因。@jsmith:只是为了表明您确实不关心组中的值。您甚至可以使用字节1来提高效率:那么,如果我使用另一个值,比如组2,会发生什么呢?@msarchet:什么都不会改变。我们不关心组中的值,只关心组的大小。它们可能是金鱼,因为这会对结果产生影响。