【发布时间】:2010-02-24 16:49:18
【问题描述】:
如果我有一个包含以下条目的列表:
苹果 香蕉 葡萄 樱桃 橘子 猕猴桃
是
的结果fruit.FindAll(f => f.Length == 6)
保证永远是
香蕉 樱桃 橙色
或者顺序可能不同?
【问题讨论】:
如果我有一个包含以下条目的列表:
苹果 香蕉 葡萄 樱桃 橘子 猕猴桃
是
的结果fruit.FindAll(f => f.Length == 6)
保证永远是
香蕉 樱桃 橙色
或者顺序可能不同?
【问题讨论】:
从某种意义上说,它并没有在文档中说明,但是如果你看看它是如何实现的当前,那么是的,它总是会以相同的顺序返回.
目前的实现方式如下:
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 循环,按顺序遍历列表,并添加匹配的项目。
【讨论】:
当前实现将保留排序。
话虽如此,documentation 中没有任何内容可以保证这将始终保持排序。理论上,未来的版本可能会线程化这个例程或其他类似的函数,这会破坏排序。我不会依赖被保留的订单。
【讨论】:
据我从List<T>.FindAll 文档中得知,没有指定返回项目的顺序,因此如果目前确实如此,那么这是一个可能会更改的实现细节。
简而言之,是的,顺序可能不同。
【讨论】:
List<T>.FindAll 的文档没有明确做出此保证。它确实暗示它是被订购的。更重要的是,尽管该方法的实现确实返回了一个有序列表,但我发现很难相信它会被更改为其他任何东西。它只会让太多人崩溃。文档中缺乏明确的措辞可能是一个疏忽。
【讨论】:
MSDN 表示执行线性搜索,尽管它没有明确表示保证顺序相同。
【讨论】: