是否可以在foreach循环中递增标识符而不评估其表达式?

Chr*_*ris 3 c#

我有一组对象,我想迭代,最终识别某种类型的模式.目前我有一堆if语句检查表达式的标志.例如,我有if(!foundFirstObjectOfTypeA)的内容.一旦我发现AI类型的第一个对象将标志设置为true,我们将不再执行该块并继续前进到下一个块.我有几种类型的模式可以识别,因此它创建了一大块难以理解和丑陋的if语句.

有没有办法在不评估foreach循环中的表达式的情况下查看/查看标识符?如果我可以按照if(identifer == ObjectA && identifer.next == ObjectB)的方式做一些事情,那么它将使我的代码更具可读性和可理解性,而且我可以在不必设置标志的情况下进行处理.

如果没有直接的方法/方式,有人有一些聪明的变通方法来模拟我想要的效果吗?

dlr*_*as2 6

使用for循环来增加i,然后只看object[i]object[i+1].你使用什么类型的收藏?一个列表?数组?所有foreach循环都隐藏了你的计数器.如果我了解你的情况,绝对没有理由使用foreach循环而不是for循环.

这适用于任何列表和任何对象序列:

功能:

public static bool ContainsSequence
    (System.Collections.Generic.IList<object> list, params object[] seq)
{
    for (int i = 0; i < list.Count() - seq.Count() + 1; i++)
    {
        int j;
        for (j = 0; j < seq.Count(); j++)
        {
            if (list[i + j] != seq[j])
                break;
        }
        if (j == seq.Count())
            return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

用法:

private static void Main(string[] args)
{
    var A = new object();
    var B = new object();
    var C = new object();
    var D = new object();

    var list = new[] {A, B, C, D};
    Console.WriteLine(ContainsSequence(list, B, C, D));
    Console.WriteLine(ContainsSequence(list, A, D, C, B, A, C));
    Console.WriteLine(ContainsSequence(list, A, B));
}
Run Code Online (Sandbox Code Playgroud)

输出:

True
False
True
Run Code Online (Sandbox Code Playgroud)

如果你知道你正在寻找多少个物体,那么这个功能可以变得更简单(如果你只是寻找两个,这几乎是 Hamid Nazari的答案 - 你只需要在下面添加AndrewS的绑定检查.)

如果你想要序列开头的索引,你可以将我的函数的返回类型更改为int并返回i而不是true(并返回-1而不是false.)