вернуть один экземпляр объекта как IEnumerable - PullRequest
17 голосов
/ 24 января 2011

У меня есть экземпляр класса foo, и я хочу вернуть его как IEnumerable. Могу ли я сделать это без создания нового списка и т. Д.

Возможно, что-то вроде следующего:

IEnumerable<foo>.fromInstance(foo)

Ответы [ 4 ]

21 голосов
/ 24 января 2011

Параметры:

  • Создайте экземпляр класса коллекции, например, массив или список. Это будет изменяемым по умолчанию, что будет немного бесполезно, если это последовательность, которую вы хотите иметь в своем API. Хотя вы можете создать ReadOnlyCollection<T> оболочку вокруг такой коллекции.
  • Напишите свой собственный блок итератора в соответствии с ответом Botz3000
  • Используйте Enumerable.Repeat(item, 1) из LINQ, если вы используете .NET 3.5.

Лучший ответ здесь зависит от использования. Если вам нужно только , чтобы вызвать другой метод, который использует последовательность, и вы знаете, что она не будет изменена, я, вероятно, использовал бы массив. Например, чтобы вызвать Concat для какой-то другой последовательности, вы можете захотеть:

var wholeList = regularList.Concat(new[] { finalValue });

У меня есть уверенность, что Concat не будет изменять массив, и ничто иное не увидит ссылку на сам массив.

Если вам нужно вернуть последовательность в какой-то другой код, и вы не знаете, что она может с этим делать, я бы, вероятно, использовал Enumerable.Repeat.

17 голосов
/ 24 января 2011

Вы могли бы сделать это:

public IEnumerable<Foo> GetSingleFooAsEnumerable() { 
    yield return singleFoo;
}
14 голосов
/ 24 января 2011

Лучший идиоматический способ сделать это - что-то вроде new[] { foo }, которое просто создает массив из 1 элемента любого типа, объявленного как foo.

Единственным возможным недостатком этого является то, что массивы не являются неизменяемыми, поэтому кто-то может привести ваше IEnumerable<T> к T[] и изменить значение там. Однако это маловероятно, поэтому я не беспокоюсь об этом.

0 голосов
/ 24 января 2011

IENumerable должен использоваться для чего-то, через что вы можете перечислять, поэтому использование его для одного экземпляра кажется довольно странным.Если вам действительно нужно, вы можете сделать это так.Возможно, это был бы лучший способ, но он должен выполнить работу:

List<foo> myList = new List<foo>();
myList.Add( myInstanceOfFoo );
IEnumerable myEnumerable = myList.AsEnumerable();

Независимо от того, как вы это видите, вы на самом деле пытаетесь составить список из одного элемента, и тогда на самом деле нет причинсоставить список.

...