如果我有一个包含以下条目的列表:
苹果 香蕉 葡萄 樱桃 橙子 奇异果
那么执行
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循环,按顺序遍历列表,并添加匹配的项目。
List<T>.FindAll
的文档并没有明确保证此功能。但它暗示它被排序了。更重要的是,该方法的实现确实返回一个有序的列表,我很难相信它会被改变成其他任何形式。那将会破坏太多人的程序。文档中缺乏明确的措辞可能只是一个疏忽。