我怎么能有边界的 LINQ GroupBy()?
How could I LINQ's GroupBy() with a boundary?
假设我有一个元素集合,这些元素具有 float
属性.
我正在按它分组,但我发现我得到了不需要的分组。
例如(使用 double
从 Random
的 NextDouble()
中获利):
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 => x.Position).Dump();
}
class Example
{
public double Position { get; set; }
}
这会导致这样的事情:
Grouping 0,00075609376689237252
Grouping 0,0010980092925475954
Grouping 0,0020200186418462629
Grouping 0,0062832017458431429
...
问题是(值得或不值得):我如何通过允许有一个像... +- 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 相差太远了。
但是 rounding 到小数点后第二位就足够了。
examples.GroupBy(x => Math.Round( x.Position,2))
正如 bleep-bloop 评论的那样:
if you want to group by sets of 0,05 you could do x => Math.Round(x.Position / 0.05)
MCVE:
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; }
}
}
假设我有一个元素集合,这些元素具有 float
属性.
我正在按它分组,但我发现我得到了不需要的分组。
例如(使用 double
从 Random
的 NextDouble()
中获利):
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 => x.Position).Dump();
}
class Example
{
public double Position { get; set; }
}
这会导致这样的事情:
Grouping 0,00075609376689237252
Grouping 0,0010980092925475954
Grouping 0,0020200186418462629
Grouping 0,0062832017458431429
...
问题是(值得或不值得):我如何通过允许有一个像... +- 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 相差太远了。
但是 rounding 到小数点后第二位就足够了。
examples.GroupBy(x => Math.Round( x.Position,2))
正如 bleep-bloop 评论的那样:
if you want to group by sets of 0,05 you could do
x => Math.Round(x.Position / 0.05)
MCVE:
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; }
}
}