List <t> .FindAll的结果是否保证与原始列表的顺序相同?</t>

时间:2010-02-24 16:49:19

标签: c# list lambda

如果我有一个包含以下条目的列表:

苹果 香蕉 葡萄 樱桃 橙子 猕猴桃

的结果
fruit.FindAll(f => f.Length == 6)

保证永远是

香蕉 樱桃 橙

或订单可能不同吗?

5 个答案:

答案 0 :(得分:7)

从某种意义上讲,它并没有保证在文档中没有说明,但是如果你看看它是如何当前实现的,那么是的,它总会以相同的顺序返回

以下是当前实施的方式:

public List<T> FindAll(Predicate<T> match)
{
    if (match == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
    }
    List<T> list = new List<T>();
    for (int i = 0; i < this._size; i++)
    {
        if (match(this._items[i]))
        {
            list.Add(this._items[i]);
        }
    }
    return list;
}

正如您所看到的,它是一个简单的for循环,按顺序遍历列表,并添加匹配的项。

答案 1 :(得分:4)

当前的实施将保留订购。

话虽如此,documentation中没有任何内容可以保证这将始终保持秩序。从理论上讲,未来版本可能会破坏此例程或其他类似的函数,这会破坏排序。我不会依赖保留的订单。

答案 2 :(得分:2)

据我所知,List<T>.FindAll文档中没有指定返回项的顺序,因此如果它确实存在,那么这是一个可能会发生变化的实现细节。

简而言之,是的,订单可能会有所不同。

答案 3 :(得分:1)

List<T>.FindAll的文档未明确提供此保证。它暗示它被命令。更重要的是,尽管该方法的实现确实返回了一个有序列表,但我发现很难相信它会被改变为其他任何东西。这简直就是打破了太多人。文件中缺乏明确的措辞可能是一种疏忽。

答案 4 :(得分:0)

MSDN表示会执行线性搜索,但并未明确表示保证其顺序相同。