Гарантируется ли результат List<T>.FindAll в том же порядке, что и исходный список?
Если у меня есть список со следующими записями:
Яблоко Банан Виноград Вишня Апельсин Киви
Является ли результат
fruit.FindAll(f => f.Length == 6)
гарантированно всегда будет
Банан Черри Апельсин
или порядок может быть другим?
5 ответов
Это не гарантируется в том смысле, что это не сказано в документации, однако, если вы посмотрите, как это реализовано в настоящее время, то да, оно всегда будет возвращаться в том же порядке.
Вот как это в настоящее время реализовано:
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
Короче говоря, да, порядок может быть другим.
Документация для List<T>.FindAll
явно не дает эту гарантию. Это намекает на то, что он заказан. Что еще более важно, хотя реализация метода возвращает упорядоченный список, и мне трудно поверить, что он будет изменен на что-то еще. Это просто сломало бы слишком много людей. Отсутствие четкой формулировки в документации, вероятно, является упущением.
MSDN говорит, что выполняется линейный поиск, хотя он явно не говорит, что он гарантированно будет в том же порядке.