Можно ли предоставить гарантию заказа для коллекции? - PullRequest
0 голосов
/ 05 февраля 2019

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

Я рассмотрел SortedList, но отклонил его из-за требованиядержа ключЯ также отклонил другие Сортированные типы по аналогичным причинам, и SortedSet из-за Linq, возвращающего IEnumerable вместо другого SortedSet, когда вы оперируете им.

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

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

- Правка

Это не столько порядок элементов в коллекции (я мог бы использовать IEnumerable), но некоторая операцияна входной коллекции.Допустим, я возвращал корень всех чисел в массиве вместо того, чтобы возвращать (root, number)[] или (root, index)[] Я хочу вернуть root[] и дать понять пользователю, что порядок элементов в возвращаемом массивесоответствует порядку элементов во входном параметре.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Нет, в C # или .Net нет ничего, что позволяло бы выражать и применять "этот метод не меняет порядок элементов в коллекции / при выполнении итерации по коллекции".

Обычное ожидание - это порядок элементовхранится в коллекции, сохраняемой во время итерации, если метод / класс явно не указан для указания переупорядочения.

Примеры «без переупорядочения»:

  • for / 'foreach`
  • .Select, .First, .Take, .SelectMany, .Where
  • индексация коллекции, которая не называется "SortedXxxxx" - List, массив.

Примеры «переупорядочивания»

  • List.Sort, List.Reverse
  • .OrderBy, .ThenBy
  • классов, которые не сохраняются/ гарантия заказа как HashSet, Dictionary, OrderedDictionary, SortedList
0 голосов
/ 05 февраля 2019

Звучит так, как будто вы хотите очередь .Первый добавленный объект будет удален первым, поэтому порядок вставки сохраняется.Обычно объекты обрабатываются из очереди с помощью метода Dequeue(), но есть метод Peek(), если вы не хотите удалять из коллекции.

Помимо этого, вам, вероятно, потребуетсянакатить свою реализацию.Скорее всего, это будет просто оболочка вокруг List<T>, где вы не сможете ничего сделать Insert ed.

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