我使用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)。
就尝试而言,到目前为止我仍无法解决任何问题,因此我将不胜感激。
谢谢
答案 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