Результат <T>.FindAll Списка, гарантировал, что был в том же порядке как исходный список?

Если у меня есть Список со следующими записями:

Банановый виноград Apple Cherry оранжевый новозеландец

Результат

fruit.FindAll(f => f.Length == 6)

гарантируемый всегда быть

Банан оранжевая Cherry

или порядок мог отличаться?

6
задан PaulB 24 February 2010 в 16:49
поделиться

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, который последовательно просматривает список и добавляет соответствующие элементы.

7
ответ дан 8 December 2019 в 17:21
поделиться

Текущая реализация сохранит порядок.

При этом в документации нет ничего, что гарантировало бы, что это всегда будет сохранять порядок. Возможно, что в будущей версии теоретически можно будет выполнить поток этой процедуры или какой-либо другой подобной функции, что нарушит порядок. Я бы не стал рассчитывать на сохранение порядка.

4
ответ дан 8 December 2019 в 17:21
поделиться

Существуют динамические счетчики, а также средства поиска объектов домена:

Hotel.countByCity(city)

Подробнее в руководстве пользователя , конечно

-121--2291423-

Это не гарантировано в том смысле, что оно не говорит его в документации, однако если вы посмотрите, как он в настоящее время реализован, то да, он всегда вернется в том же порядке.

Вот как он в настоящее время реализован:

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;
}

Как вы видите, это простой цикл для, который последовательно проходит через список, и добавляет предметов, которые соответствуют.

-121--4213325-

Насколько я могу судить из документации List < T > .FindAll , порядок возвращаемого изделия не указан, поэтому если в настоящее время это деталь реализации, которая может быть изменена.

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

2
ответ дан 8 December 2019 в 17:21
поделиться

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

0
ответ дан 8 December 2019 в 17:21
поделиться

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

1
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: