2013-10-31 32 views
24

Tôi muốn biết cách chuyển đổi một DataTable thành một từ điển. Tôi đã làm một cái gì đó như thế này.Chuyển đổi một DataTable sang từ điển C#

using System.Linq; 

internal Dictionary<string,object> GetDict(DataTable dt) 
{ 
    return dt.AsEnumerable() 
     .ToDictionary<string, object>(row => row.Field<string>(0), 
           row => row.Field<object>(1)); 
} 

Nhưng tôi nhận được:

System.Data.EnumerableRowCollection không chứa một định nghĩa cho 'ToDictionary' và tốt nhất phương pháp mở rộng quá tải 'System.Linq.Parallel.Enumerable.ToDictionary (System. LINQ.ParallelQuery, System.Func, System.Collections.Generic.IEqualityComrparer) 'có một số đối số không hợp lệ

Làm cách nào để giải quyết vấn đề này?

Cảm ơn

+0

Vui lòng đăng thông báo lỗi hoàn chỉnh. – cadrell0

+0

Tôi đã thêm thông báo lỗi đầy đủ –

Trả lời

59

Phương pháp chung ToDictionary có 3 tham số. Bạn để lại một lần, vì vậy nó không biết phải làm gì. Nếu bạn muốn chỉ định tất cả các tham số, nó sẽ là <DataRow, string, object>.

internal Dictionary<string,object> GetDict(DataTable dt) 
{ 
    return dt.AsEnumerable() 
     .ToDictionary<DataRow, string, object>(row => row.Field<string>(0), 
           row => row.Field<object>(1)); 
} 

Tất nhiên, nếu bạn rời khỏi trình biên dịch, trình biên dịch có thể suy ra các loại, do đó bạn không gặp lỗi.

+1

+1, vâng, đây là lý do chính, chi tiết hơn tại [ToDictionary ] (http://msdn.microsoft.com/en-us/library/bb548657 .aspx) –

1

Tôi đã tìm ra giải pháp nhưng không biết tại sao. Tôi thay đổi nội dung câu hỏi của tôi hoàn thành mã chỉ cho làm cho nó rõ ràng những gì tôi đang làm một tôi đã thay đổi điều này

internal Dictionary<string, object> GetDict(DataTable dt) 
    { 
     Dictionary<String, Object> dic = dt.AsEnumerable().ToDictionary(row => row.Field<String>(0), row => row.Field<Object>(1)); 
     return dic; 
    } 
+0

nhưng giờ nó hoạt động. Không biết sự khác biệt là gì –

6

ToDictionary dự kiến ​​các IEnumberable<T> như các loại đầu tiên ... bạn đã nói với nó rằng đó là một chuỗi mà là sai nó IEnumerable<DataRow>

nó bị nhầm lẫn bởi bạn quy định cụ thể các loại ... thử này ...

internal Dictionary<string,object> GetDict(DataTable dt) 
{ 
    return dt.AsEnumerable() 
     .ToDictionary(row => row.Field<string>(0), 
           row => row.Field<object>(1)); 
} 
1

tôi nghĩ rằng điều này sẽ giúp bạn:

  DataTable dt = new DataTable(); 
      dt.Columns.Add("Column1"); 
      dt.Columns.Add("Column2"); 
      dt.Rows.Add(1, "first"); 
      dt.Rows.Add(2, "second"); 
      var dictionary = dt.Rows.OfType<DataRow>().ToDictionary(d => d.Field<string>(0), v => v.Field<object>(1)); 
10

Tất cả các câu trả lời previos không giúp tôi, vì vậy tôi đã làm điều này:

myList = dt.AsEnumerable() 
.ToDictionary<DataRow, string, string>(row => row[0].ToString(), 
             row => row[1].ToString()); 

và nó làm việc tuyệt vời!

Các vấn đề liên quan