我有一个整数数组的列表,我想检查每个数组是否按时间顺序排列数组,如果不是,我希望它从列表中删除。
目前我这样做:
for (int i = 0; i < allXcombis.Count(); i++)
{
bool remove = false;
for (int j = 0; j < allXcombis[i].Length; j++)
{
if (allXcombis[i].Count() - 1 > j)
if (allXcombis[i][j] != allXcombis[i][j + 1] - 1)
remove = true;
}
if (remove)
allXcombis.Remove(allXcombis[i]);
}
但我对这段代码并不满意,我认为可以更轻松。
答案 0 :(得分:2)
首先,我可能会提前检查数组是“按时间顺序”进入自己的方法,并通过早期return
来提高它的效率:
bool IsChronological(int[] array)
{
for (int i = 0; i < array.Length - 1; i++)
{
if (array[i] != array[i + 1] - 1)
return false;
}
return true;
}
然后我会简单地使用RemoveAll()
:
allXcombis.RemoveAll(a => !IsChronological(a));
这样,您可以获得简洁易读的代码,而且您不必担心列表中的索引(正如其他人所提到的,您的代码中存在错误,因为您对索引并不小心)。 / p>
答案 1 :(得分:0)
当您从循环中的列表中删除时,您需要修复循环变量或向后循环。然后,在Count之后你不需要()。并且在分配remove = true后你可以从循环中断,这将提高性能。
for (int i = allXcombis.Count - 1; i >= 0; i--)
{
bool remove = false;
for (int j = 0; j < allXcombis[i].Length; j++)
{
if (allXcombis[i].Length - 1 > j)
{
if (allXcombis[i][j] != allXcombis[i][j + 1] - 1)
{
remove = true;
break;
}
}
}
if (remove)
allXcombis.Remove(allXcombis[i]);
}
答案 2 :(得分:0)
如果按时间顺序排列,那么你需要检查&lt;不!=。 你也可以简化一些事情。最重要的是当你发现它没有排序以突破内循环时,所以你不要继续迭代。 当你删除时你也需要减少i,因为你会跳过一些数组(否则如果i = 2你移除第二个数组,那么第三个数组就会变成第二个,但是在下一个迭代中我将是3个,所以你'跳过它)
for (int i = 0; i < allXcombis.Count; i++)
{
for (int j = 0; j < allXcombis[i].Length-1; j++)
{
if (allXcombis[i][j] > allXcombis[i][j + 1] - 1)
{
allXcombis.Remove(allXcombis[i]);
i--;
break;
}
}
}
答案 3 :(得分:0)
我同意svick使用像他提出的“IsChronological”这样的专用方法,但我想为这种方法添加一些安全性和性能:
bool IsChronological(int[] array)
{
bool result = ((array == null) || (array.Length == 0)) ? false : true; //Null or empty arrays are not chronological by definition (also avoid exceptions)
if (result)
{
result = (array.Length == 1) ? true : false; //Arrays with only one element are chronological by definition
if (!result)
{
int length = array.Length - 1;
int index = 0;
while ((index < length) && (array[index] == array[index] + 1))
index++;
result = (index == array.length);
}
}
return result;
}