Разделение диапазона в c#

#c#

#c#

Вопрос:

разделите значения диапазона на группы, например, если диапазон от 0 до 100, и у меня есть четыре группы A, B, C, D. если я хочу разделить диапазон на четыре группы, такие как 0-25 группа D 26-50 группа C 51-75 группа B 76-100 группа A

как сделать такую группировку с помощью C # и сохранить диапазоны в списке. тогда как определить, принадлежит ли какое-то число к какой группе? например, 55 принадлежит группе B.

пожалуйста, помогите!

Комментарии:

1. использование: int index = (Value / 25);

2. Switch для этого не подходит. Покажите, что вы уже пробовали.

3. @JeroenvanLangen почти полезно. Тем не менее, там была ошибка out-by-one.

4. Извините — забыл, что мы имеем дело с диапазонами. Вы можете использовать Dictionary<int,List<T>> где rangehigh — это верхний предел диапазона. Вложите свои ifs для сортировки списка. Удачи!

Ответ №1:

Вы могли бы попробовать что-то вроде:

     var someNumbers = new [] { 10,67,45,26,78,53,12,45,68};
    var groupNames = new [] { "A", "B", "C", "D" };

    //                               Key                      Value
    var result = someNumbers.GroupBy(v => groupNames[v / 25], p => p);

    foreach(var v in result.OrderBy(i => i.Key))
    {
        Console.WriteLine(v.Key);
        foreach(var k in v)
            Console.WriteLine("  "   k);
    }
  

Я группирую значения, для value / 25 которых будет целочисленное деление, и группирую значения по частям по 25. Например: значение 13 . 13 / 25 = 0 так 13 что будут сгруппированы по 0. Например: значение 67 . 67 / 25 = 2 , поэтому оно будет сгруппировано по 2.

Единственная проблема заключается в том, что если значение превышает 99, вы получаете IndexOfOutBoundsException .

Это может быть более безопасным:

 public static void Main()
{
    var someNumbers = new [] { 10,67,45,26,78,53,12,45,68};
    var groupNames = new [] { "A", "B", "C", "D" };

    var result = someNumbers.GroupBy(v => v / 25, p => p);

    foreach(var v in result.OrderBy(i => i.Key))
    {
        // check if the key can be used as index for the name array.
        if(v.Key >= groupNames.Length)
            Console.WriteLine(v.Key   " no name for that");
        else
            Console.WriteLine(groupNames[ v.Key]);

        foreach(var k in v)
            Console.WriteLine("  "   k);
    }

}
  

Посмотрите здесь живую демонстрацию: https://dotnetfiddle.net/8XElaZ

Комментарии:

1. Нужно вычесть 1 из массива groupnames, иначе вы будете на одно место каждый раз

2. 25 должно быть в первой группе, 50 во второй и т.д. таким образом, у вас есть одна ошибка.

3. мне нужно, чтобы оно было динамическим, диапазон может быть разным, а также количество групп

Ответ №2:

Вот еще несколько примеров кода, которые помогут вам:

 var groups = new[] { "A", "B", "C", "D" };

//Range size and group size is configurable, should work with any range.
var range = Enumerable.Range(0, 1000).ToArray();
var groupSize = range.Length / groups.Length;

// Here we split range in groups. If range size is not exactly divisible
// to groups size, all left elements go to the last group, then we form
// a dictionary with labels as keys and array of numbers as values
var split = range
    .GroupBy(c => Math.Min(c / groupSize, groups.Length - 1))
    .ToDictionary(c => groups[c.Key], c => c.ToArray());

Console.WriteLine(String.Join(" ", ranges["A"]));