C# 使用Linq获取子阵列的索引
我的问题很简单,我很确定答案肯定已经在这里了,但是找不到 各位,数组不是列表,也不是IEnumerable!!!或者你是说我必须将其转换为列表? 我想使用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,但没能理解它 将其转换为列
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,所以您可以使用另一个问题的答案”。这并不是说问题是一样的。问:“鲸鱼有肺吗?”。答:“牛是哺乳动物,长着长长的身躯,鲸鱼也是哺乳动物,所以鲸鱼有肺。”真的吗?