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

Какой лучший способ добавить один элемент в IEnumerable <T>?

Вот как я бы добавил один элемент к объекту IEnumerable:

//Some IEnumerable<T> object
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" };

//Add one item
arr = arr.Concat(new string[] { "JKL" });

Это неудобно. Я не вижу метод, называемый как-то вроде ConcatSingle().

Есть ли более чистый способ добавить один элемент к объекту IEnumerable?

4b9b3361

Ответ 1

Нет, это примерно так же кратким, как вы получите использование встроенных функций языка/структуры.

Вы всегда можете создать метод расширения, если хотите:

arr = arr.Append("JKL");
// or
arr = arr.Append("123", "456");
// or
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "...");

// ...

public static class EnumerableExtensions
{
    public static IEnumerable<T> Append<T>(
        this IEnumerable<T> source, params T[] tail)
    {
        return source.Concat(tail);
    }
}

Ответ 2

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

var newCollection = arr.ToList();
newCollection.Add("JKL"); //is your new collection with the item added

Ответ 3

Напишите метод расширения ConcatSingle:)

public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item)
{
    return source.Concat(new [] { item } );
}

Но вам нужно быть более осторожным с вашей терминологией.
Вы не можете добавить элемент в IEnumerable<T>. Concat создает новый экземпляр.

Пример:

var items = Enumerable.Range<int>(1, 10)
Console.WriteLine(items.Count()); // 10
var original= items;
items = items.ConcatSingle(11);
Console.WriteLine(original.Count());   // 10
Console.WriteLine(items.Count()); // 11

Как вы можете видеть, исходное перечисление, которое мы сохранили в original, не изменилось.

Ответ 4

Так как IEnumerable доступен только для чтения, вам нужно преобразовать его в список.

var new_one = arr.ToList().Add("JKL");

Или вы можете получить метод расширения, например:

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item)
{
    return source.Concat(item);
}

Ответ 5

Вы назначаете массив IEnumerable. Почему бы вам не использовать тип Array вместо IEnumerable?

В противном случае вы можете использовать IList (или List), если хотите изменить коллекцию.

Я использую IEnumerable только для параметров param, когда мне нужно читать, и IList (или List), когда мне нужно менять элементы в нем.