В C # 3.0 вы можете создать анонимный класс со следующим синтаксисом
var o = new { Id = 1, Name = "Foo" };
Есть ли способ добавить эти анонимные классы в общий список?
Пример:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List<var> list = new List<var>();
list.Add(o);
list.Add(o1);
Другой пример:
List<var> list = new List<var>();
while (....)
{
....
list.Add(new {Id = x, Name = y});
....
}
c#
.net
generics
anonymous-types
DHornpout
источник
источник
new[] { new{ Id = (int?)null, Name = "Foo" }, new { Id = (int?)1, Name = "Foo" }}
Ответы:
Вы могли бы сделать:
Есть много способов снять шкуру с этого кота, но в основном все они будут где-то использовать вывод типов - что означает, что вы должны вызывать универсальный метод (возможно, как метод расширения). Другой пример может быть:
Вы поняли :)
источник
Вот ответ.
источник
string.Join
и интерполяция строк, поэтому нет необходимости использоватьforeach
иFormat
.Есть много способов сделать это, но некоторые ответы здесь создают список, содержащий элементы мусора, которые требуют очистки списка.
Если вы ищете пустой список универсального типа, используйте опцию Выбрать по списку кортежей, чтобы создать пустой список. Элементы не будут созданы.
Вот одна строка для создания пустого списка:
Затем вы можете добавить к нему свой общий тип:
В качестве альтернативы, вы можете сделать что-то вроде ниже, чтобы создать пустой список (но я предпочитаю первый пример, потому что вы можете использовать его также для заполненной коллекции Tuples):
источник
Enumerable.Empty<object>().Select(o=>definition).ToList()
Не совсем, но вы можете сказать,
List<object>
и все будет работать. Однакоlist[0].Id
не сработает.Это будет работать во время выполнения в C # 4.0 при наличии
List<dynamic>
, то есть вы не получите IntelliSense.источник
Я полагаю
будет работать.
Вы могли бы также написать это так:
источник
Я обычно использую следующее; главным образом потому, что вы «начинаете» с пустого списка.
В последнее время я пишу это так:
Использование метода повтора также позволит вам сделать:
... который дает вам начальный список с первым добавленным элементом.
источник
Вы можете сделать это в своем коде.
источник
В последней версии 4.0 можно использовать динамический, как показано ниже
источник
Я проверил IL на несколько ответов. Этот код эффективно предоставляет пустой список:
источник
IEnumerable
, тогда как моя версия возвращаетList
, именно то, что спросил OP.new object[] { }.Select(o => new { Id = default(int), Name = default(string) }).ToList()
Вот моя попытка.
Я придумал это, когда написал нечто подобное для создания анонимного списка для пользовательского типа.
источник
Вы можете создать динамический список.
«Динамический» инициализируется первым добавленным значением.
источник
Вместо этого:
Вы могли бы сделать это:
Однако вы получите ошибку времени компиляции, если попытаетесь сделать что-то подобное в другой области, хотя это работает во время выполнения:
Проблема в том, что во время выполнения доступны только члены Object, хотя intellisense будет показывать свойства id и name .
В .net 4.0 решением является использование ключевого слова dynamic istead of object в приведенном выше коде.
Другое решение состоит в том, чтобы использовать отражение, чтобы получить свойства
источник
Вот еще один метод создания списка анонимных типов, который позволяет начинать с пустого списка, но при этом иметь доступ к IntelliSense.
Если вы хотите сохранить первый элемент, просто вставьте одну строку в строку.
источник
источник
Это старый вопрос, но я подумал, что вставлю свой ответ C # 6. Мне часто приходится настраивать тестовые данные, которые легко вводятся в код в виде списка кортежей. С парой функций расширения можно получить этот красивый, компактный формат, не повторяя имена в каждой записи.
Это дает IEnumerable - если вы хотите список, который вы можете добавить, просто добавьте ToList ().
Волшебство происходит от пользовательского расширения Add методов для кортежей, как описано на https://stackoverflow.com/a/27455822/4536527 .
}
Единственное, что мне не нравится, это то, что типы отделены от имен, но если вы действительно не хотите создавать новый класс, тогда этот подход все равно позволит вам иметь читаемые данные.
источник
Я очень удивлен, что никто не предложил инициализаторы коллекции. Таким способом можно добавлять объекты только тогда, когда список создан, отсюда и название, однако это кажется наилучшим способом сделать это. Не нужно создавать массив, а затем преобразовывать его в список.
Вы всегда можете использовать
object
вместо,dynamic
но пытаться сохранить его в истинно общем виде, тогдаdynamic
имеет больше смысла.источник
Вы можете сделать это следующим образом:
Мне это кажется немного "хакерским", но это работает - если вам действительно нужен список и вы не можете просто использовать анонимный массив.
источник
Для вашего второго примера, где вы должны инициализировать новый
List<T>
, одна идея состоит в том, чтобы создать анонимный список, а затем очистить его.Или как метод расширения, должно быть проще:
Или, возможно, даже короче,
источник
Если вы используете C # 7 или выше, вы можете использовать типы кортежей вместо анонимных типов.
источник
Исходя из этого ответа , я придумал два метода, которые могли бы выполнить задачу:
Вы можете использовать такие методы, как
У этого ответа есть похожая идея, но я не видел ее до тех пор, пока не применил эти методы.
источник
Попробуйте с этим:
источник
источник