Соглашения о присвоении имен в С#: ToSomething vs. AsSomething

Поскольку я писал некоторые методы расширения для своих объектов бизнес-логики, я пришел к вопросу о переименовании методов преобразования. someObject.ToAnotherObject() будет хорошо сочетаться с широко используемым object.ToString().

Однако LINQ, например, смешивает оба варианта, и я не могу найти разницу между ними. ToDictionary(), ToList(), AsParallel(), AsQueryable(),...

Каковы различия между этими двумя соглашениями об именах и что я должен знать, чтобы решить, использовать ли для моих собственных классов?

Ответ 1

ToDictionary и ToList имеют префикс To, потому что они не обязательно сохраняют структурное идентичность исходной коллекции или ее свойств.

  • Преобразование a List<T> в Dictionary<K, V> создает коллекцию со всей новой структурой.
  • Преобразование a HashSet<T> в List<T> удаляет свойство уникальности множеств.

Методы с префиксом As не выполняют никаких из этих действий - они просто предоставляют альтернативный вид исходной коллекции. Они обогащают его.

Ответ 2

В Linq методы ToXXX все выполняют запрос и создают новый объект из результатов, тогда как методы AsXXX создают новый запрос, который каким-то образом отличается. Это может быть тот же объект, но доступ через другой интерфейс (AsEnumerable() делает это), или это может быть новый объект, который изменяет функциональность (другие методы делают это, хотя некоторые проверки, чтобы проверить, могут ли они просто вернуть данный объект, например AsQueryable() будет возвращать source, если он уже реализует IQueryable<T> или создает новый EnumerableQuery<TElement> в противном случае).