Итак, в дополнение к приведенному ниже, я хочу реализовать значение джокера, которое может быть любым значением.
Допустим, у нас есть числа (3,8,5,6,J,2,9)
И вывод должен быть (5,6,J)
Я имею в виду, что J в списке должен вести себя как 7, и это будет сгруппировано.
Есть ли способ сделать это?
++++
Я пытаюсь найти решение для приведенного ниже кода, опубликованного Маурисио Шеффером.
Выход;
group 2
group 4
group 7,8,9
group 5,6
Что мне нужно: только группы 7,8,9 и не другие.
Я имею в виду, что когда функция находит последовательные числа, она должна группировать последовательные числа только тогда, когда количество групп больше 2.
Любые идеи/помощь, пожалуйста?
static class Example
{
public static IEnumerable<IEnumerable<int>> GroupConsecutive(this IEnumerable<int> list)
{
var group = new List<int>();
foreach (var i in list)
{
if (group.Count == 0 || i - group[group.Count - 1] == 1)
{
group.Add(i);
}
else
{
yield return group;
group = new List<int> { i };
}
}
}
class Program
{
static void Main(string[] args)
{
var groups = new[] {2, 4, 7, 8, 9, 5, 6}.GroupConsecutive();
foreach (var g in groups)
{
Console.WriteLine("group: {0}", string.Join(",", g.Select(x => x.ToString()).ToList()));
Console.ReadLine();
}
}
}
Я не уверен, что это одно и то же, я могу найти группы .Count() > 2, но это не работает. Мне нужно предотвратить группировку .Count() < 3.
Попробуйте это (Net.Fiddle здесь):
using System;
using System.Linq;
using System.Collections.Generic;
static class Example
{
public static IEnumerable<IEnumerable<int>> GroupConsecutive(this IEnumerable<int> list)
{
var group = new List<int>();
var j = 1;
foreach (var i in list)
{
if (j != list.Count() && (group.Count == 0 || i - group[group.Count - 1] == 1))
{
group.Add(i);
}
else if (j == list.Count()) {
if (group.Count == 0 || i - group[group.Count - 1] == 1)
group.Add(i);
if (group.Count > 2) {
yield return group;
}
}
else
{
if (group.Count > 2) {
var groupCopy = new List<int>(group);
group = new List<int>() {i};
yield return groupCopy;
} else {
group = new List<int>() {i};
}
}
j++;
}
}
}
public class Program
{
public static void Main(string[] args)
{
var groups = new[] {2, 4, 7, 8, 9, 10, 5, 6, 7,12}.GroupConsecutive();
foreach (var g in groups)
{
Console.WriteLine("group: {0}", string.Join(",", g.Select(x => x.ToString()).ToList()));
Console.ReadLine();
}
}
}
кажется, работает, но если мы не поместим группу возврата yield после цикла foreach, он не найдет вторую группу подряд. Но в любом случае я снова поместил туда группу возврата yield, если .group.Count() >= 3, и это работает. Большое спасибо .
@Catklysm, на самом деле, он не находит последнюю группу подряд
Совершенно верно, я исправил его, чтобы включить и последнюю группу.
@Catklysm, не забудьте принять рабочие ответы! Ваше здоровье!
@Athanasios Kataras, большое спасибо... Извините, меня не было в сети.
@Athanasios, когда я пытаюсь добавить второе условие (например, (i=group[group.Count -1] также сгруппировать его отдельно), я не могу получить правильный результат. У вас есть идеи?
Итак, вы ищете группы .Где находится .Count()
> 2
?