是否有一种简单的方法可以在另一个列表中找到一个列表,也可以考虑订单? (除了循环遍历它们。)基本上就像String .IndexOf
的工作方式一样。
string[] lookInThis = { "a", "b", "c", "d" };
string[] lookForThis1 = { "b", "c" };
string[] lookForThis2 = { "b", "d" };
int FoundLoc = string.Join(",", lookInThis).IndexOf(string.Join(",", lookForThis1));
这适用于我的琴弦,但感觉可以改进。
在我的例子中,这些是我预期的输出:
lookForThis1 1
lookForThis2 -1 or something like that.
答案 0 :(得分:2)
这应该做你所要求的。不完全是因为我把它扔在一起而且我不是LINQ精灵:
public int SublistIndex(string[] lookInThis, string[]lookForThis)
{
int i;
for (i = 0; i < lookInThis.Count(); i++)
{
if (lookInThis.ElementAt(i).Equals(lookForThis.First()))
{
//Found the first element of the list we are searching for
int j;
//Now we need to check if the other elements are there in correct order
for (j = 0; j < lookForThis.Count(); j++)
{
if (i + j == lookInThis.Count())
{
//Reached the end of the lookInThis list with no match
return -1;
}
if (!lookInThis.ElementAt(i + j).Equals(lookForThis.ElementAt(j)))
{
//Sequence is not identical, stop inner loop
break;
}
}
if (j == lookForThis.Count())
{
//found it!
return i;
}
}
}
//reached the end and didn't find it
return -1;
}
经过测试:
string[] t1 = { "a", "b", "c" };
string[] t2 = { "b", "c" };
string[] t3 = { "b", "d" };
int tt1 = SublistIndex(t1, t2);
int tt2 = SublistIndex(t1, t3);
tt1 = 1
和tt2=-1
您可以基本上将string
替换为任何类型,前提是您还要将.equals()
比较更改为合适的比较。
工作原理:
循环遍历lookInThis
,当找到lookForThis
的起始元素时,它会启动另一个循环来比较它们。如果它发现任何元素不匹配,则会断开此循环并恢复。如果它到达lookForThis
的末尾,则返回第一个循环的索引。它到达lookInThis
的末尾时返回-1。快速而肮脏,因此可能不建议使用大量列表。