Порядок в списке или массиве всегда одинаков? - PullRequest
0 голосов
/ 26 сентября 2019

Рассмотрим простой список целых чисел:

var ints = new List<int>
{
    1, 2, 3
};

Будет ли он всегда упорядочен в одном и том же порядке (1, 2, 3), если я выполню цикл через него?Даже если я передам это в качестве аргумента функции или если я передам его в виде списка для обработки потоком?

Отличаются ли массивы?А как насчет IEnumerable?

Что если я, например:

ints.RemoveAt(1);
ints.Add(4);

Всегда ли это будет 1,3,4?

А что если я отредактирую элемент?Это только целые числа, но если бы они были сложными объектами, то, например, человек, и я схватил человека Bob (может быть с любым индексом) и, например, добавил всю его биографию.

Изменит ли это порядок списка?

Я мог бы использовать OrderBy, но мне просто интересно узнать, совпадает ли порядок списка.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

В платформе .Net Списки и массивы являются коллекциями на основе индекса.
Это означает, что к элементу внутри коллекции можно получить доступ, используя его индекс в коллекции - так что да - они оба должны сохранять один и тот же порядок элементовinside.

Это связано с тем, что List<T> и T[] реализуют интерфейс IList<T>, который определяется как набор объектов, доступ к которым по индексу возможен индивидуально.

An IEnumerable на самом деле не сортируется, все, что он делает, это представляет метод с именем GetEnumerator() - и хотя IEnumerator, который он возвращает, предоставляет свойство Current и метод MoveNext(), который подразумевает порядок - это не совсем так.

Фактически, благодаря yield return вы можете создать IEnumearble даже без коллекции - например:

Random rnd = new Random();
IEnumerable<int> someMethod()
{
     for(var i=0;i<10;i++)
         yield return rnd.Next(1, 10);
}

IList<T> реализует интерфейс IEnumerable<T>, ноа не наоборот.

Итак, чтобы ответить на ваши вопросы:

Будет ли он всегда заказываться в одном и том же порядке (1, 2, 3), если я буду проходить через него?Даже если я передам это в качестве аргумента функции?Даже если я передам его как список для обработки потоком?

Да.

Отличаются ли массивы?

Не в этом отношении.

А как насчет IEnumerable?

Они могут отличаться.

0 голосов
/ 26 сентября 2019

Список - это просто расширенный массив с большим количеством функций.

Это означает, что если вы добавите что-то в список, он останется на том же месте

Но он перемещает вещи в индексвниз, если вы удалите что-то в середине списка.

Это означает, что если у вас есть этот список

List<int> numbers = new List<int>() {0, 1, 2, 3, 4};

И вы удалите элемент с индексом 1, вы получите этот список

{0, 2, 3, 4};

Это означает, что число в индексе 2 теперь находится в индексе 1.

Порядок списка изменится только при изменении самого списка (Удаление и элемент, Добавление элементаили вручную изменяет порядок списка (например, orderBy)

Он не изменится, если вы измените объект в списке.

IEnumerable может отличаться, потому что это просто интерфейсэто определяет некоторые методы, которые должны быть реализованы, как метод GetEnumerator. Это означает, что это зависит от реализации IEnumerable

(подробнее на этот вопрос " Может кто-нибудь объяснитьIEnumerable и IEnumerator для меня?"

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...