Список для анонимного ввода в C # - PullRequest
2 голосов
/ 08 января 2010

Короткая история: я хочу преобразовать список / словарь в анонимный объект

В основном то, что у меня было раньше:

var model = from item in IEnumerable<Item>
   select new
     {
     name = item.Name
     value = item.Value
     }

и т.д.. Если у меня есть name, item.Name в списке или словаре, как я могу создать тот же анонимный объект model?

Редактировать: Уточнение: Если словарь содержит [name, item.Name] и [value, item.Value] в качестве пар ключ-значение, как бы мне было создать model, не предполагая, что вы не знаете ни name, ни value?

Ответы [ 3 ]

5 голосов
/ 08 января 2010

Поскольку List<T> реализует IEnumerable<T> ваш существующий код должен работать точно так же:

var model = from item in yourList
            select new { name = item.Name };

Для Dictionary<TKey,TValue> вы можете просто сделать это:

var model = from item in yourDictionary
            select new {
                name = item.Key
                value = item.Value
            };

Это работает, поскольку Dictionary<TKey,TValue> реализует IEnumerable<KeyValuePair<TKey,TValue>>, поэтому во втором выражении item будет напечатано как KeyValuePair<TKey,TValue>, что означает, что вы можете проецировать новый тип, используя item.Key и item.Value.

0 голосов
/ 08 января 2010

Если вы хотите создать где-то еще другой анонимный объект, совместимый по типу с тем, который вы генерируете из IEnumerable<Item>, вы можете сделать это, убедившись, что созданный вами анонимный тип имеет:

  1. Столько же членов
  2. Члены с таким же типом
  3. Члены с таким же именем
  4. ... в том же порядке

Если вы сделаете это, они будут отображены в один и тот же сгенерированный тип.

Теперь, почему вы захотите сделать это вне меня, поэтому я почти уверен, что не понял вашего вопроса. Вы должны опубликовать больше информации о том, что вы хотите сделать.

В любом случае, вот код для создания анонимного объекта, совместимого по типу с тем из вашего IEnumerable:

var x = new
{
    name = dict["name"],
    value = dict["value"]
};

Поскольку он подчиняется всем приведенным выше правилам, он будет того же типа, что и ваши объекты, сгенерированные из вашего запроса Linq.

0 голосов
/ 08 января 2010

Похоже, вы просто хотите получить значения из словаря? Если это так, MyDictionary. Значения должны помочь вам.

...