C# 我怎么能在林克';s GroupBy()有边界吗?

C# 我怎么能在林克';s GroupBy()有边界吗?,c#,linq,linq-group,C#,Linq,Linq Group,假设我有一个元素集合,它有一个float属性 我是按它分组的,但我发现我得到了不想要的分组 例如(使用double从Random的NextDouble()中获利): void Main() { var examples=新列表(); var rnd=新随机数(); 对于(int i=0;ix.Position).Dump(); } 课例 { 公共双位置{get;set;} } 这将导致类似这样的情况: 分组000075609376689237252 分组00010980092925475954

假设我有一个元素集合,它有一个
float
属性

我是按它分组的,但我发现我得到了不想要的分组

例如(使用
double
Random
NextDouble()中获利):

void Main()
{
var examples=新列表();
var rnd=新随机数();
对于(int i=0;i<100;i++)
{
var newPosition=rnd.NextDouble();
Add(新示例{Position=newPosition});
}
GroupBy(x=>x.Position).Dump();
}
课例
{
公共双位置{get;set;}
}
这将导致类似这样的情况:

分组000075609376689237252

分组00010980092925475954

分组0002020018641846269

分组00062832017458431429


问题是(是否值得):我如何通过允许有一个像…+-0.05?

+-0.05的边界有点不清楚:

对于像这样的集合:{0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1}
下一个值为0.01,但所有值均在0.05的[+-0.05]范围内。
但是0.01和0.06的距离太远了

但小数点后2位可能不够

examples.GroupBy(x => Math.Round( x.Position,2))
如评论所述:

如果您想按0,05的集合进行分组,可以执行
x=>Math.Round(x.Position/0.05)

MCVE:

使用系统;
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共图书馆
{
var examples=新列表();
var rnd=新随机数();
对于(int i=0;i<100;i++)
{
var newPosition=rnd.NextDouble();
Add(新示例{Position=newPosition});
}
GroupBy(x=>Math.Round(x.Position,2)).Dump();
示例.GroupBy(x=>x=>Math.Round(x.Position/0.05)).Dump();
}
公开课范例
{
公共双位置{get;set;}
}
}

现场示例:

+-0.05的边界有点不清楚:

对于像这样的集合:{0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1}
下一个值为0.01,但所有值均在0.05的[+-0.05]范围内。
但是0.01和0.06的距离太远了

但小数点后2位可能不够

examples.GroupBy(x => Math.Round( x.Position,2))
如评论所述:

如果您想按0,05的集合进行分组,可以执行
x=>Math.Round(x.Position/0.05)

MCVE:

使用系统;
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共图书馆
{
var examples=新列表();
var rnd=新随机数();
对于(int i=0;i<100;i++)
{
var newPosition=rnd.NextDouble();
Add(新示例{Position=newPosition});
}
GroupBy(x=>Math.Round(x.Position,2)).Dump();
示例.GroupBy(x=>x=>Math.Round(x.Position/0.05)).Dump();
}
公开课范例
{
公共双位置{get;set;}
}
}

现场示例:

在groupby中将您的双精度四舍五入到所需的近似值?喜欢ehttps://dotnetfiddle.net/5s9jkRIs 四舍五入一个足够好的解决方案,还是需要+-0.05?在这种情况下,我们需要一个预定义的10值集,步长为0.01,这样我们才能了解如何将它们组合在一起?@xdtTransform感谢您的提示!四舍五入似乎足够好,因为它可以完成这项工作,是的,我猜第一组(0.00~0.05)可以完成10组。另一种方法是,每个值有一组值。在我的示例范围内,结果看起来像是将双精度整数四舍五入到groupby中所需的近似值?喜欢ehttps://dotnetfiddle.net/5s9jkRIs 四舍五入一个足够好的解决方案,还是需要+-0.05?在这种情况下,我们需要一个预定义的10值集,步长为0.01,这样我们才能了解如何将它们组合在一起?@xdtTransform感谢您的提示!四舍五入似乎足够好,因为它可以完成这项工作,是的,我猜第一组(0.00~0.05)可以完成10组。另一种方法是,每个值有一组值。在我的示例范围内,如果您想按
0,05
的集合进行分组,那么结果看起来会增加,您可以执行
x=>Math.Round(x.Position/0.05)
。除此之外,它还更具可读性。@Bleep Bloop:是的,再加上你所建议的实际上是用一个整数作为键进行分组,然后OP可以转换为int以避免比较浮点。@LaurentLARIZZA我不认为对
GroupBy
的浮点进行四舍五入会导致
Math.Round
方法的不平等,虽然施法可能会溢出(虽然不是针对这种特殊情况)。@bleep在回答中添加了一个属性链接到您的档案。如果需要,您可以编辑与该零件相关的任何内容。如果您希望按
0,05
的集合进行分组,则可以执行
x=>Math.Round(x.Position/0.05)
。除此之外,它还更具可读性。@Bleep Bloop:是的,再加上你所建议的实际上是用一个整数作为键进行分组,然后OP可以转换为int以避免比较浮点。@LaurentLARIZZA我不认为对
GroupBy
的浮点进行四舍五入会导致
Math.Round
方法的不平等,虽然施法可能会溢出(虽然不是针对这种特殊情况)。@bleep在回答中添加了一个属性链接到您的档案。如果需要,可以编辑与该零件相关的任何内容。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public void Main()
    {
        var examples = new List<Example>();
        var rnd = new Random();
        for (int i = 0; i < 100; i++)
        {
            var newPosition = rnd.NextDouble();
            examples.Add(new Example { Position = newPosition });
        }

        examples.GroupBy(x => Math.Round( x.Position,2)).Dump();


        examples.GroupBy(x => x => Math.Round(x.Position / 0.05)).Dump();
    }

    public class Example
    {
        public double Position { get; set; }
    }
}