我有一组对象,我想迭代,最终识别某种类型的模式.目前我有一堆if语句检查表达式的标志.例如,我有if(!foundFirstObjectOfTypeA)的内容.一旦我发现AI类型的第一个对象将标志设置为true,我们将不再执行该块并继续前进到下一个块.我有几种类型的模式可以识别,因此它创建了一大块难以理解和丑陋的if语句.
有没有办法在不评估foreach循环中的表达式的情况下查看/查看标识符?如果我可以按照if(identifer == ObjectA && identifer.next == ObjectB)的方式做一些事情,那么它将使我的代码更具可读性和可理解性,而且我可以在不必设置标志的情况下进行处理.
如果没有直接的方法/方式,有人有一些聪明的变通方法来模拟我想要的效果吗?
使用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.)