使用Linq

时间:2018-12-12 10:13:44

标签: c# linq

我的问题很简单,我很确定答案一定已经在SO上了,但是找不到。

伙计们,数组不是列表,也不是IEnumerable!还是您告诉我我必须将其转换为列表?

我想使用Linq获取子数组的索引(第一个)。

int[] arr= new int[] { 1, 5, 3, 2, 4 };
int[] sub= new int[] { 3, 2 };

int index = ? // Expected result 2

我看了Array.FindIndexArray.IndexOf,但看不出来。

将其转换为列表似乎不是一个很好的计划。这具有惊人的表现:

列表arrList =((int [])arr).ToList(); 列表subList =(((int [])sub).ToList();

谢谢

1 个答案:

答案 0 :(得分:2)

您可以使用此方法:

public static int GetIndex<T>(IList<T> largeList, IList<T> sublist)
{
    for (int i = 0; i < largeList.Count - sublist.Count; i++)
    {
        bool isContained = largeList.Skip(i).Take(sublist.Count).SequenceEqual(sublist);
        if (isContained)
            return i;
    }

    return -1;
}

或更优化但可读性更差的实现

public static int GetIndex<T>(IList<T> largeList, IList<T> sublist, IEqualityComparer<T> comparer = null)
{
    if(comparer == null) comparer = EqualityComparer<T>.Default;
    for (int i = 0; i < largeList.Count - sublist.Count; i++)
    {
        bool allEqual = false; 
        for (int ii = 0; ii < sublist.Count; ii++)
        {
            allEqual = comparer.Equals(largeList[i + ii], sublist[ii]);
            if (!allEqual)
                break;
        }
        if (allEqual)
            return i;
    }

    return -1;
}