C# 使用Linq获取子阵列的索引

C# 使用Linq获取子阵列的索引,c#,linq,C#,Linq,我的问题很简单,我很确定答案肯定已经在这里了,但是找不到 各位,数组不是列表,也不是IEnumerable!!!或者你是说我必须将其转换为列表? 我想使用Linq获得子阵列(第一个)的索引 int[] arr= new int[] { 1, 5, 3, 2, 4 }; int[] sub= new int[] { 3, 2 }; int index = ? // Expected result 2 我查看了Array.FindIndex和Array.IndexOf,但没能理解它 将其转换为列

我的问题很简单,我很确定答案肯定已经在这里了,但是找不到

各位,数组不是列表,也不是IEnumerable!!!或者你是说我必须将其转换为列表?

我想使用Linq获得子阵列(第一个)的索引

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

int index = ? // Expected result 2
我查看了
Array.FindIndex
Array.IndexOf
,但没能理解它

将其转换为列表似乎不是一个很好的计划。这有一个戏剧性的表现:

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


谢谢

您可以使用此方法:

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;
}
公共静态int-GetIndex(IList-largeList,IList-sublist)
{
for(int i=0;i
或者这种更优化但可读性较差的实现:

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;
}
public static int GetIndex(IList largeList、IList sublist、IEqualityComparer comparer comparer=null)
{
如果(comparer==null)comparer=EqualityComparer.Default;
for(int i=0;i
您可以使用以下方法:

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;
}
公共静态int-GetIndex(IList-largeList,IList-sublist)
{
for(int i=0;i
或者这种更优化但可读性较差的实现:

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;
}
public static int GetIndex(IList largeList、IList sublist、IEqualityComparer comparer comparer=null)
{
如果(comparer==null)comparer=EqualityComparer.Default;
for(int i=0;i
不是我要求的,除非你告诉我必须先将简单数组转换为列表。
IList
!=<代码>列表
@Sinattr:Yes和array!=IList!=List@RWC:您的阵列实现了IList
。使用
intindex=GetIndex(arr,sub)进行尝试。添加了一种更优化/高效的方法,它还可以通过自定义
IEqualityComaprer
@Rango:ok,看起来很有用。谢谢。这不是我想要的,除非你告诉我必须先将我的简单数组转换为列表。
IList
!=<代码>列表
@Sinattr:Yes和array!=IList!=List@RWC:您的阵列实现了IList。使用
intindex=GetIndex(arr,sub)进行尝试。添加了一种更优化/高效的方法,它还可以通过自定义
IEqualityComaprer
@Rango:ok,看起来很有用。谢谢。伙计们,这不是我想要的,除非你们告诉我必须先把我的简单数组转换成列表。请看问题@RWC:请至少先尝试一下答案,然后再告诉我这不是你想要的。“数组不是列表,也不是IEnumerable”-从语义上说你是正确的,但是因为实现了
IEnumerable
,IList
-你错了。好吧,我的问题与另一个问题不同,因为我的问题是关于数组的。数组实现了IList这一事实并不能使我的问题变得相同。只需说“Array实现了IList,所以您可以使用另一个问题的答案”。这并不是说问题是一样的。问:“鲸鱼有肺吗?”。答:“牛是哺乳动物,有长尾巴,鲸鱼也是哺乳动物,所以鲸鱼有肺。”真的吗?伙计们,这不是我想要的,除非你们告诉我必须先将我的简单数组转换为列表。请看问题@RWC:请至少先尝试一下答案,然后再告诉我这不是你想要的。“数组不是列表,也不是IEnumerable”-从语义上说你是正确的,但是因为实现了
IEnumerable
,IList-你错了。好吧,我的问题与另一个问题不同,因为我的问题是关于数组的。数组实现了IList这一事实并不能使我的问题变得相同。只需说“Array实现了IList,所以您可以使用另一个问题的答案”。这并不是说问题是一样的。问:“鲸鱼有肺吗?”。答:“牛是哺乳动物,长着长长的身躯,鲸鱼也是哺乳动物,所以鲸鱼有肺。”真的吗?