#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"]));