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