Как я мог LINQ GroupBy () с границей? - PullRequest
0 голосов
/ 13 мая 2019

Допустим, у меня есть коллекция элементов со свойством 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; }
}

Это привело бы к чему-то вроде этого:

Группировка 0,00075609376689237252

Группировка 0,0010980092925475954

Группировка 0,0020200186418462629

Группировка 0,0062832017458431429

...

Вопрос (достойный или нет): как я могу сгруппировать их, позволив иметь «границу», например ... + - 0,05?

1 Ответ

2 голосов
/ 13 мая 2019

Граница + -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))

Как bleep-bloop прокомментировал:

если вы хотите сгруппировать по наборам 0,05, вы можете сделать 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; }
    }
}

Живой пример: https://dotnetfiddle.net/LDNBgu

...