【问题标题】:Is the result of List<T>.FindAll guaranteed to be in the same order as the original list?List<T>.FindAll 的结果是否保证与原始列表的顺序相同?
【发布时间】:2010-02-24 16:49:18
【问题描述】:

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

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

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

保证永远是

香蕉 樱桃 橙色

或者顺序可能不同?

【问题讨论】:

    标签: c# list lambda


    【解决方案1】:

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

    目前的实现方式如下:

    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 循环,按顺序遍历列表,并添加匹配的项目。

    【讨论】:

    • 你指的是哪个实现? .net 2.0、3.5、4.0、单声道? :)
    • @Rob:好点 :) 我附上了当前的 .Net 3.5 实现。
    • 依赖别人代码的内部结构对我来说似乎不是一个好主意。
    【解决方案2】:

    当前实现将保留排序。

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

    【讨论】:

      【解决方案3】:

      据我从List<T>.FindAll 文档中得知,没有指定返回项目的顺序,因此如果目前确实如此,那么这是一个可能会更改的实现细节。

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

      【讨论】:

        【解决方案4】:

        List&lt;T&gt;.FindAll 的文档没有明确做出此保证。它确实暗示它是被订购的。更重要的是,尽管该方法的实现确实返回了一个有序列表,但我发现很难相信它会被更改为其他任何东西。它只会让太多人崩溃。文档中缺乏明确的措辞可能是一个疏忽。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 线性搜索是指所用算法的效率,不提供算法是否保持顺序的信息。
          猜你喜欢
          • 1970-01-01
          • 2010-11-05
          • 2014-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-16
          相关资源
          最近更新 更多