1

我有一个整数数组列表,我想检查每个数组是否按时间顺序排列,如果不是,我希望将其从列表中删除。

目前我这样做:

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]);
}

但我对这段代码并不满意,我认为它可以更容易完成。

4

4 回答 4

2

首先,我可能会将检查数组是否“按时间顺序”提取到它自己的方法中,并通过return提前从循环中 ing 来提高效率:

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));

这样,您可以获得简洁易读的代码,并且您不必担心列表中的索引(正如其他人提到的,您的代码中有错误,因为您不小心索引)。

于 2012-07-15T09:50:32.573 回答
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;
}
于 2012-07-15T12:38:52.187 回答
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]);
}
于 2012-07-15T09:37:20.520 回答
0

如果按时间顺序是指排序,那么您需要检查 < 而不是 !=。你也可以简化一些事情。最重要的是当你发现它没有排序以打破内部循环,这样你就不会继续迭代。另外,您需要在删除时减少 i ,因为否则您将跳过一些数组(例如,如果 i = 2 并且您删除了第二个数组,那么第三个数组将变为第二个,但 i 在下一次迭代中将是 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;
        }
    }
}
于 2012-07-15T09:40:00.033 回答