Перечислимый: это официальный термин?

"Материализовать" хорошее имя для такого кода, или есть лучшее (и официальное) имя?

enumerable as ICollection<T> ?? enumerable .ToArray()

РЕДАКТИРОВАТЬ: я уточнил код (и его цели)

// or "MaterializeIfNecessary"
public static IEnumerable<T> Materialize<T>(this IEnumerable<T> source)
{
    // if you use code analysis tools like resharper, you may have to return a 
    // different type to turn off warnings - even a placeholder interface like 
    // IMaterializedEnumerable<T> : IEnumerable<T> { } 

    if (source == null) return null;

    return source as ICollection<T> ?? source.ToArray();
}

Проблема:

static void Save(IEnumerable<string> strings)
{
    // The following code is Resharper suggested solution to 
    // "Possible multiple enumeration of IEnumerable" warning
    // ( http://confluence.jetbrains.com/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable ):
    strings = strings as string[] ?? strings.ToArray(); // you're not calling 
                                                        // ToArray because you 
                                                        // need an array, here

    if (strings.Any(s => s.Length >= 255)) throw new ArgumentException();

    File.AppendAllLines("my.path.txt", strings);
}

При использовании метода расширения первая строка должна стать более декларативной:

strings = strings.MaterializeIfNecessary();

person Notoriousxl    schedule 11.02.2013    source источник
comment
Я бы назвал это AsReadOnly или ToReadOnlyCollection   -  person Magnus    schedule 12.02.2013
comment
@Magnus, который должен быть ответом :) Кстати, я думаю, что AsReadOnlyCollection лучше описывает результат   -  person Sergey Berezovskiy    schedule 12.02.2013
comment
Зачем приводить IEnumerable к IReadOnlyCollection? stackoverflow.com/a/55661/211627   -  person JDB still remembers Monica    schedule 12.02.2013
comment
@lazyberezovsky Я так и сделаю.   -  person Magnus    schedule 12.02.2013
comment
Его единственная цель: 1) немедленно вызвать отложенное выполнение 2) и / или предотвратить множественные перечисления (в тех точках / алгоритмах, которые вам нужны) Тип возврата также должен быть IEnumerable ‹T›, я использую IReadOnlyCollection только для того, чтобы инструменты анализа кода ( как resharper) понимают, что метод возвращает статическую копию источника (как это делают ToArray () / ToList ()). Try / cast предназначены для предотвращения бесполезной материализации уже материализованных источников. Я торопился, отредактирую пост с более четкой информацией, как только смогу   -  person Notoriousxl    schedule 12.02.2013
comment
@Magnus: Я согласен с тем, что имя должно иметь приставку IfNeeded (или что-то в этом роде). Раньше я называл его PreventMultipleEnumerations, но его цель также могла заключаться в очистке отложенного выполнения, поэтому я решил переименовать его в поисках официального термина. Из-за своей цели, если источник уже материализован, бесполезен (и неэффективен) для ToList () / ToArray () снова и снова.   -  person Notoriousxl    schedule 12.02.2013
comment
Я отредактировал вопрос, извините, если это было непонятно с самого начала. Я искал название этого: перечислимый как ICollection ‹T› ?? перечислимый .ToArray ()   -  person Notoriousxl    schedule 12.02.2013
comment
@Notoriousxl Я думаю, вам лучше изменить метод сохранения, чтобы вместо этого использовать IList<string>.   -  person Magnus    schedule 12.02.2013
comment
Не думаю, что ответившие поняли то, о чем вы пытались спросить. То, что вы пытаетесь сделать, - это в точности материализовать IEnumerable<T> как твердый тип коллекции, поскольку он также может быть просто запросом. И у вас это неплохо получилось (я имею в виду реализацию метода). Но здесь есть одна загвоздка: ваш метод возвращает либо существующую коллекцию (простым приведением), либо новую коллекцию. Для первой операции такой глагол, как Materialize, хорош в качестве имени функции, поскольку вы действуете в списке, но для второй операции что-то вроде To... более согласовано с функциями, определенными фреймворком.   -  person nawfal    schedule 28.09.2013
comment
Но это не очень хорошо с его первой операцией. В любом случае добавление IfNeeded не требуется, на самом деле я бы против этого. Может быть, лучше назвать AsCollection или даже просто Materialize неплохо. Еще одно предложение - вернуть ICollection<T>, поскольку вы выполняете вызов, и в большинстве случаев здесь имеет смысл что-то более конкретное, чем IEnumerable<T>. См. Соответствующую ссылку здесь: stackoverflow.com/questions/4621561/   -  person nawfal    schedule 28.09.2013
comment
@nawfal именно это я и сделал, поскольку обнаружил, что этот термин также используется в официальных статьях MSDN. :) Но я не вернул ICollection ‹T›, поскольку он предоставляет методы записи.   -  person Notoriousxl    schedule 29.09.2013


Ответы (2)


Как уже предложил @Magnus, ToReadOnlyCollection - хорошее описательное имя для вашего метода. Также я думаю, AsReadOnlyCollection - не то хорошее имя. Обычно AsXXX методы не скрывают и не оборачивают источник. Такие методы просто возвращают источник как один из интерфейсов, уже реализованных источником. Вы можете использовать такой метод вместо литья.

И Materialize совершенно ничего не говорит о назначении метода. Что это означает? Смогу ли я потрогать свою последовательность руками? Будет печататься на бумаге? Сохранено в файл?

И да, я также не понимаю, почему вам нужно конвертировать IEnumerable, который уже доступен только для чтения, в ReadOnlyCollection.

person Sergey Berezovskiy    schedule 11.02.2013
comment
Базовая коллекция, на которую указывает источник IEnumerable, может быть недоступна только для чтения, вы можете преобразовать ее в обычный список и добавить в него что-то. Если коллекция является коллекцией только для чтения, это невозможно. - person Magnus; 12.02.2013
comment
stackoverflow.com/questions/ 14819990 / - person Notoriousxl; 12.02.2013

Я бы назвал это ToReadOnlyCollection. Он дает больше информации о том, что на самом деле делает функция.
Что касается материализации источника, то, похоже, это происходит только в том случае, если вызывается ToArray(). (Обертывание только источника не материализует его)

person Magnus    schedule 11.02.2013
comment
IEnumerable уже доступен только для чтения, поэтому я все еще думаю, что AsReadOnlyCollection - немного лучшее имя :) - person Sergey Berezovskiy; 12.02.2013
comment
@lazyberezovsky Да, это имя тоже подойдет. Особенно, если функция только обернула исходный код IEnumerable. Но кажется, что иногда он вызывает ToArray перед переносом, поэтому To может быть лучшим именованием. - person Magnus; 12.02.2013
comment
ToXY лучше всего, потому что в качестве метода расширения его можно использовать как ToList() или ToArray(). Но я не понимаю, зачем это нужно. - person Mare Infinitus; 12.02.2013
comment
Да, я уже смотрел на такие методы фреймворка, как AsEnumerable, и тоже думаю, что AsXXX здесь не годится) - person Sergey Berezovskiy; 12.02.2013
comment
stackoverflow.com/questions/ 14819990 / - person Notoriousxl; 12.02.2013