代码之家  ›  专栏  ›  技术社区  ›  PaulB

list<t>findall的结果是否保证与原始列表的顺序相同?

  •  5
  • PaulB  · 技术社区  · 14 年前

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

    苹果 香蕉 葡萄 樱桃色 橙色 几维鸟

    是的结果

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

    保证永远

    香蕉 樱桃 橙色

    或者订单可能不同?

    5 回复  |  直到 14 年前
        1
  •  6
  •   BFree    14 年前

    从某种意义上来说,它不能保证在文档中不会说出来,但是如果你看一下它是怎样的 目前 实现,然后是的,它总是以相同的顺序返回。

    这就是它的方式 目前 实施:

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

        2
  •  4
  •   Reed Copsey    14 年前

    当前的实现将保留顺序。

    也就是说,在 documentation 这保证了这将始终保持秩序。从理论上讲,将来的版本可能会执行这个例程或其他类似的函数,这会破坏顺序。我不会依赖于保存的命令。

        3
  •  2
  •   Rob    14 年前

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

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

        4
  •  1
  •   JaredPar    14 年前

    文件 List<T>.FindAll 未明确作出此保证。它确实暗示它被命令了。更重要的是,尽管该方法的实现确实返回了一个有序的列表,但我发现很难相信它会每一个都更改为其他任何内容。这只会让太多人心碎。文件中缺乏明确的措辞可能是一种疏忽。

        5
  •  0
  •   Jonathon Bolster    14 年前

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