Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Как сохранить переменные анонимного типа в к коллекцию?

#c_sharp


Как сохранить переменные анонимного типа в к коллекцию?
    


Ответы

Ответ 1



Зависит от того, что дальше предполагается делать с коллекцией. Если коллекция - объект временный, то можно вынести работу с ней в обобщенный метод (разумеется, сама коллекция также будет иметь снаружи анонимный тип): static List CreateCollection(T item) { return new List { item }; } static void AddToCollection(List list, T item) { list.Add(item); } // ... var c = CreateCollection(new { a = 5, b = "foo" }); AddToCollection(c, new { a = 6, b = "bar" }); Если коллекцию надо куда-то сохранить, можно попробовать найти базовый тип или написать обобщенный адаптер: ICollection Collection { get; set; } IEnumerable AnotherCollection { get; set; } // ... Collection = CreateCollection(new { a = 5, b = "foo" }); AnotherCollection = CreateCollection(new { a = 6, b = "bar" }); Также всегда можно воспользоваться "тяжелой артиллерией" - dynamic (но будет тормозить, я предупредил). Но если с анонимными классами слишком много проблем - возможно, стоит уже перейти к обычному классу?

Ответ 2



Альтернативный вариант создания списка без использования generic метода: var collection = Enumerable.Range(0, 0) .Select(a => new { a = default(int), b = default(string) }) .ToList(); collection.Add(new { a = 5, b = "foo" }); В данном случае используется Enumerable.Range, который возвращает пустую коллекцию, но за счет селекта определяется тип элементов. При применении ToList получается обычный список с типом элементов анонимного класса.

Ответ 3



Допустим есть переменная item: var item = new { Value = 1, Text = "abc" }; Первый способ Можно сделать из неё массив var items = new[] { item }; Таким же способом можно сделать из нескольких переменных массив. Разумеется, его можно превратить в список с помощью метода ToList(). Второй способ Можно просто использовать метод Enumerable.Repeat var items = Enumerable.Repeat(item, 1); Если надо продублировать этот элемент несколько раз, то передаём в этот метод не 1, а нужное количество раз. Затем добавляем вызов ToList или ToArray по вкусу. Третий способ Идея подана @Grundy, но я бы уточнил, что вовсе необязательно вызывать Select именно для последовательности чисел полученной из метода Enumerable.Range. Берите любую подходящую коллекцию и вызывайте метод Select. Если также вам нужен индекс помните о перегрузке Select с индексом. И вообще используйте этот способ, когда первый и второй не так удобно использовать иначе он будет выглядеть искусственно. Пример: var strings = new[] { "abc", "def" }; // [ "{ Value = 1, Text = "abc" }, { Value = 2, Text = "def" } ] var items = strings.Select((value, index) => new { Value = index + 1, Text = value }).ToArray(); Добавление элементов после инициализации Потом (если нужно) можно добавлять элементы либо через метод Add списка (класс List), либо через LINQ метод Concat (немного извращённо, но тоже можно). items = items.Concat(new[] { new { Value = 2, Text = "def" } }).ToArray();

Комментариев нет:

Отправить комментарий