如果我有一个包含以下条目的列表:
苹果 香蕉 葡萄 樱桃 橙子 猕猴桃
是
的结果fruit.FindAll(f => f.Length == 6)
保证永远是
香蕉 樱桃 橙
或订单可能不同吗?
答案 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表示会执行线性搜索,但并未明确表示保证其顺序相同。