2016-07-29 2 views
1

Я пытаюсь преобразовать DataTable в словарь, используя метод, описанный here, но я получаю сообщение об ошибкеDataTable ToDictionary несколько колонок

Не может неявно преобразовать тип System.Collections.Generic.Dictionary>»для 'System.Collections.Generic.Dictionary``.

Этот link помог, но только одно значение втягивается в словарь, а не несколько, что мне нужно.

Спасибо за любую помощь.

public class MCEAV 
{ 
    public int ID { get; set; } 
    public int BOOK_ID { get; set; } 
    public double DATA { get; set; } 
} 

Dictionary<int, MCEAV> dctGREEKS = new Dictionary<int, MCEAV>(); 
dctGREEKS = DATActx.MONTECARLO_EAVs.Select(Z => new { Z.ID, Z.BOOK_ID, Z.DATA}).ToDictionary(Z => Z.ID); 
+0

Если у вас есть 1 значение в 'MONTECARLO_EAVs' вы получите одно значение в словаре. Это просто. – user3185569

ответ

2

Вы должны указать имя класса при использовании new еще это анонимный тип:

dctGREEKS = DATActx.MONTECARLO_EAVs.Select(Z => 
           new MCEAV() 
           { 
            ID = Z.ID, 
            BOOK_ID = Z.BOOK_ID, 
            DATA = Z.DATA 
           }).ToDictionary(Z => Z.ID); 

Так new { Z.ID, Z.BOOK_ID, Z.DATA} является экземпляр анонимного типа, созданный компилятором, а new MCEAV() является экземпляр типа MCEAV, который вы хотите для своего словаря.

+0

Спасибо! это сводило меня с ума, я использовал способы заставить код работать. – Zeus

2

Основываясь на вашем коде, я думаю, вы хотите что-то вроде этого.

var result = dt.AsEnumerable() 
     .ToDictionary(x=>x.Field<int>("ID"), 
         x=> new MCEAV() 
         { 
          ID = x.Field<int>("ID"), 
          BOOK_ID = x.Field<int>("BOOK_ID"), 
          DATA = x.Field<double>("DATA") 

         }); 

Проверить это Example

+0

спасибо Хари, это тоже работает – Zeus