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

6

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

苹果 香蕉 葡萄 樱桃 橙子 奇异果

那么执行

fruit.FindAll(f => f.Length == 6)

保证始终是

香蕉 樱桃 橙子

或者顺序可能不同吗?

5个回答

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
你指的是哪个实现?.net 2.0、3.5、4.0、mono? :) - Rob
@Rob:好观点 :) 我已经附上了当前的 .Net 3.5 实现。 - BFree
1
依赖于别人代码的内部结构对我来说似乎不是一个好主意。 - brian

4

当前实现将保留顺序。

话虽如此,文档中没有保证这将始终保留顺序的内容。理论上,未来版本可能会将此例程或某些类似函数线程化,从而破坏排序。我不会依赖于保留顺序。


2
据我从List<T>.FindAll文档中了解到,返回的项的顺序未指定,因此如果现在是这样的话,那么这是一个可能会改变的实现细节。

简而言之,是的,顺序可能不同。


1

List<T>.FindAll 的文档并没有明确保证此功能。但它暗示它被排序了。更重要的是,该方法的实现确实返回一个有序的列表,我很难相信它会被改变成其他任何形式。那将会破坏太多人的程序。文档中缺乏明确的措辞可能只是一个疏忽。


0

MSDN表示执行线性搜索,尽管它没有明确说明保证按相同顺序进行。


线性查找是指算法的效率,并不提供有关算法是否保留顺序的信息。 - RAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接