我需要对列表项进行测试的匹配条件非常耗时。而且,我知道该条件将匹配列表中不超过3个项目。

因此,检查所有列表项可能不是最好的主意。但是,当我尝试最多使用3次FindFindex()方法时,该测试所花费的时间比使用FindAll()Where()的情况更多。

如何加快该方法的速度,或者更快地找到最多三场比赛?

| #  Method            Time (sec)
| -------------------------------
| 1   Find (one-by-one)   42.37
| 2   FindAll             30.17
| 3   Where               30.53


方法1:

{
    int index;
    Predicate<T> predicate = t =>
        {
            ...
        };

    index = myCollection.FindIndex(predicate);

    if (index != -1)
    {
        T t1 = myCollection[index];
        myCollection.RemoveAt(index);

        index = myCollection.FindIndex(predicate);

        if (index != -1)
        {
            T t2 = myCollection[index];
            myCollection.RemoveAt(index);

            index = myCollection.FindIndex(predicate);

            if (index != -1)
            {
                T t3 = myCollection[index];

                return new T[] { t1, t2, t3 };
            }
            else
            {
                return new T[] { t1, t2 };
            }
        }
        else
        {
            return new T[] { t1 };
        }
    }
    else
    {
        return new T[] { };
    }
}


方法2:

{
    return myCollection.FindAll(t =>
    {
        ...
    }).ToArray();
}


方法3:

{
    return myCollection.Where(t =>
    {
        ...
    }).ToArray();
}


编辑:修改方法1:

{
    int index;
    Predicate<T> predicate = t =>
        {
            ...
        };

    index = myCollection.FindIndex(predicate);

    if (index != -1)
    {
        T t1 = myCollection[index];

        index = myCollection.FindIndex(index + 1, predicate);

        if (index != -1)
        {
            T t2 = myCollection[index];

            index = myCollection.FindIndex(index + 1, predicate);

            if (index != -1)
            {
                T t3 = myCollection[index];

                return new T[] { t1, t2, t3 };
            }
            else
            {
                return new T[] { t1, t2 };
            }
        }
        else
        {
            return new T[] { t1 };
        }
    }
    else
    {
        return new T[] { };
    }
}

最佳答案

您的方法较慢,因为它会遍历整个集合三遍,并且您还要执行删除操作(也要付出代价(“ O(n),其中n是(计数-索引)”,according to MSDN))。

您可以通过调用FindIndex(int, predicate)重载来逃避这两种情况,其中int会在迭代源集合时谴责开始位置。

因此,请替换出现这种情况的两个地方:

myCollection.RemoveAt(index);

index = myCollection.FindIndex(predicate);


有了这个:

index = myCollection.FindIndex(index + 1, predicate)

10-07 13:38