Гарантируется ли результат 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.FindAll, порядок возвращаемых элементов не указан, поэтому, если он делает это в настоящее время, это деталь реализации, которая может быть изменена.

Короче говоря, да, порядок может быть другим.

Документация для List<T>.FindAll явно не дает эту гарантию. Это намекает на то, что он заказан. Что еще более важно, хотя реализация метода возвращает упорядоченный список, и мне трудно поверить, что он будет изменен на что-то еще. Это просто сломало бы слишком много людей. Отсутствие четкой формулировки в документации, вероятно, является упущением.

MSDN говорит, что выполняется линейный поиск, хотя он явно не говорит, что он гарантированно будет в том же порядке.

Другие вопросы по тегам