排序一个列表+检测至少5个直接跟随的项目

本文关键字:5个 跟随 项目 检测 一个 列表 排序 | 更新日期: 2023-09-27 18:12:28

我有一个

List<myobject> test 

myobject看起来像这样:

public string wert;
public string symbol;

包含wert

的值
14
13
13
12
5
5
4
4
3

14
4
4
5
13
3
13
5
12

或更多或更少的其他数字。

目标是对它进行排序。我通过

var temp = from mmm in test
           orderby Convert.ToInt16(mmm.wert) descending select mmm;

然后我想找出是否有一行至少有5个元素彼此直接跟随。我的意思是,例如:

1-2-3-4-5

所以每个元素之间的差应该是1

我用

myobject vorher = null;
int anzahleins = 0;
foreach (var kl in temp)
{
    if (vorher != null)
    {
        if (Convert.ToInt16(vorher.wert) - Convert.ToInt16(kl.wert) == 1)
            anzahleins++;
    }
    vorher = kl;
}
if (anzahleins >= 4)
    return true;
else
    return false;

返回

14
13
13
12
5
5
4
4
3

也是正确的,因为它是

14
13
12
5
4
3

满足条件4次。但是,只有当所有元素都直接跟随在一起时,它才应该这样做。

Linq会怎么说?

排序一个列表+检测至少5个直接跟随的项目

当差异不为1时,您应该重置anzahleins。您应该在foreach循环中执行check(==4)。现在它只检查是否至少有四个随机匹配。

bool _flag = false;
foreach (var kl in temp)
{
    if (vorher != null)
    {
        if (Convert.ToInt16(vorher.wert) - Convert.ToInt16(kl.wert) == 1)
        {
            anzahleins++;
        }
        else anzahleins = 0;
        if (anzahleins >= 4) _flag = true;
    }
    vorher = kl;
}
return _flag
List<MyObject> test = new List<MyObject>();
// populate test
var sorted = test.OrderByDescending(x => Convert.ToInt16(x.Wert)).ToList();
bool flag = false;
int count = 0;
short lastValue = short.MaxValue;
foreach (short wert in sorted.Select(x => Convert.ToInt16(x.Wert)))
{
    if (wert - lastValue == 1)
        count++;
    else
        count = 0;
    if (count == 4)
    {
        flag = true;
        break;
    }
    lastValue = wert;
}