Подтвердить что ты не робот

Вернуть объект одного экземпляра как IEnumerable

Я имею в виду класс foo, и я хочу вернуть его как IEnumerable. Могу ли я сделать это, не создавая новый список и т.д.

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

IEnumerable<foo>.fromInstance(foo)
4b9b3361

Ответ 1

Параметры:

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

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

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

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

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

Ответ 2

вы можете сделать это:

public IEnumerable<Foo> GetSingleFooAsEnumerable() { 
    yield return singleFoo;
}

Ответ 3

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

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

Ответ 4

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

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

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