从List <int>

时间:2019-10-06 10:58:55

标签: c# list numbers

我使用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 个答案:

答案 0 :(得分:2)

您可以尝试以下方法。关键是通过检测顺序并选择前两个来标记要删除的项目。

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 :(得分:1)

您可以尝试以下方法:

    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