在另一个列表中查找列表

时间:2015-11-05 22:35:55

标签: c# list sublist

是否有一种简单的方法可以在另一个列表中找到一个列表,也可以考虑订单? (除了循环遍历它们。)基本上就像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.

1 个答案:

答案 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 = 1tt2=-1

您可以基本上将string替换为任何类型,前提是您还要将.equals()比较更改为合适的比较。

工作原理:

循环遍历lookInThis,当找到lookForThis的起始元素时,它会启动另一个循环来比较它们。如果它发现任何元素不匹配,则会断开此循环并恢复。如果它到达lookForThis的末尾,则返回第一个循环的索引。它到达lookInThis的末尾时返回-1。快速而肮脏,因此可能不建议使用大量列表。