Удалить два целых из трех последовательных значений из списка <int> - PullRequest
3 голосов
/ 06 октября 2019

Я использую Winforms и C #. И у меня есть более 300 целых чисел в списке, и это короткий пример:

List<int> lst = new List<int>();
lst.Add(4);
lst.Add(25);
lst.Add(26);
lst.Add(27);
lst.Add(38);
lst.Add(51);
lst.Add(52);
lst.Add(53);
lst.Add(75);
//Etc.

Мне нужно удалить значения (25, 26), но сохранить 27. Затем снова удалить значения (51, 52), но сохранить53 .. и т. Д.

Таким образом, в основном, если найдено три последовательных значения, таких как (1, 2, 3), нам нужно удалить (1, 2) и сохранить значение (3).

Что касается попыток, я не мог пока почесать голову вокруг любого решения, поэтому я был бы признателен за любую помощь.

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Вы можете попробовать следующее. Ключ маркирует элементы для удаления, определяя последовательность и выбирая первые два.

var excludeList = lst.Distinct()
                     .GroupBy(num => 
                                 Enumerable.Range(num, int.MaxValue - num + 1)
                                 .TakeWhile(lst.Contains)
                                 .Last()) 
                     .Where(seq => seq.Count() >= 3)
                     .SelectMany(seq => seq.OrderBy(num => num).Take(2));


var result = lst.Where(x=> !excludeList.Contains(x));

Выход

4 
27 
38 
53 
75 
1 голос
/ 06 октября 2019

Вы можете попробовать это:

    static void Test()
    {
      var list = new List<int>();
      list.Add(4);
      list.Add(25);
      list.Add(26);
      list.Add(27);
      list.Add(38);
      list.Add(51);
      list.Add(52);
      list.Add(53);
      list.Add(75);
      var result = new List<int>();
      int count = list.Count;
      bool passover;
      if ( count > 0 )
        for ( int index = 0; index < count; )
        {
          passover = false;
          if ( index < count - 3 )
          {
            int v1 = list[index];
            int v2 = list[index + 1];
            int v3 = list[index + 2];
            if ( v3 == v2 + 1 && v2 == v1 + 1 )
              passover = true;
          }
          if ( passover )
          {
            result.Add(list[index + 2]);
            index += 3;
          }
          else
          {
            result.Add(list[index]);
            index++;
          }
        }
      foreach ( var item in result )
        Console.WriteLine(item);
    }

Вывод:

4
27
38
53
75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...