#c# #.net #linq #anonymous-types
#c# #.net #linq #анонимные типы
Вопрос:
Это то, что у меня есть:
List<Person> list = new List<Person>()
{
new Person { Name="test", Age=1 },
new Person { Name="tester", Age=2 }
};
var items = list.Select(x =>
{
return new
{
Name = x.Name
};
});
foreach (object o in items)
{
Console.WriteLine(o.GetType().GetProperty("Name").GetValue(o, null));
}
Я чувствую, что делаю это неправильно.
Есть ли более простой способ получить доступ к свойствам анонимных типов в коллекции?
Ответ №1:
Также используйте var
ключевое слово в foreach
строке вместо общего object
типа. Затем компилятор автоматически разрешит анонимный тип и все его члены, чтобы вы могли получить доступ к свойствам напрямую по имени.
foreach (var o in items)
{
Console.WriteLine(o.Name);
}
Комментарии:
1. 1. Для обработки анонимных типов было введено
var
ключевое слово.
Ответ №2:
var items = list.Select(x =>new { Name = x.Name });
foreach (var o in items)
{
Console.WriteLine(o.Name);
}
Просто используйте var, и у вас будет полная поддержка типов
Ответ №3:
Почему бы не просто это?
var items = list.Select(x => x.Name);
foreach (var o in items)
Console.WriteLine(o);
Вы получаете только одно поле, нет необходимости создавать другой анонимный тип.
Комментарии:
1. Или даже
list.Select(x => x.Name).ForEach(o => Console.WriteLine(o));
2. @BoltClock: давайте не будем впадать в крайности :).
3. Тем не менее, вы правы. Если OP хочет напечатать только имена каждого пользователя и ничего больше…
4. @BoltClock: на первый взгляд, я бы сказал, что это то, чего он хочет. Вот почему я так сильно все упростил.
Ответ №4:
Предыдущих ответов достаточно. Что касается упрощения, обратите внимание, что вы не отреагировали на максимально возможное упрощение. Вы можете написать
list.ForEach(person => Console.WriteLine(person.Name));
или
list.Select(person => person.Name).ToList().ForEach(Console.WriteLine);
Ответ №5:
Если вы все равно собираетесь выполнять итерации по всей анонимной коллекции, вы могли бы ToList()
это сделать и использовать List.ForEach()
метод:
List<Person> list = new List<Person>()
{
new Person { Name="test", Age=1},
new Person { Name="tester", Age=2}
};
var items = list.Select(x =>
{
return new
{
Name = x.Name
};
}).ToList();
items.ForEach(o => Console.WriteLine(o.Name));
Комментарии:
1. @Dani: Просто попробовал это без ToList, и я получаю: Ошибка ‘System. Коллекции. Общий. IEnumerable<Анонимный тип #1>’ не содержит определения для ‘ForEach’ и никакого метода расширения ‘ForEach’, принимающего первый аргумент типа ‘System. Коллекции. Общий. Удалось найти IEnumerable<Анонимный тип #1>’ (вам не хватает директивы using или ссылки на сборку?)