我的问题很简单,我很确定答案一定已经在SO上了,但是找不到。
伙计们,数组不是列表,也不是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
,但看不出来。
将其转换为列表似乎不是一个很好的计划。这具有惊人的表现:
列表arrList =((int [])arr).ToList(); 列表subList =(((int [])sub).ToList();
谢谢
答案 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;
}