Как перечислять через анонимно типизированную коллекцию?

#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 или ссылки на сборку?)