泛型类型的Linq类型转换

本文关键字:类型转换 Linq 泛型类型 | 更新日期: 2023-09-27 18:15:12

我有这个代码,我发现,但它不工作,即使我尝试了许多转换。基本上,它巧妙地将一个Datatable转换成一个可以序列化的List。

错误是无法将Dictionary<string, object>转换为List<object>:

public GridBindingData GetSomething() {
DataTable dt = GetDatatable();
var columns = dt.Columns.Cast<System.Data.DataColumn>();
var data = dt.AsEnumerable()
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] })
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null))
    .ToList<object>();
return new GridBindingData() { Data = data , Count = dt.Rows.Count };
}

我尝试了很多转换,包括:

List<object> newdata = (List<object>)data.AsEnumerable().Cast<object>();

基本上GridBindingData的Data属性必须有一个List<object>。这可能吗?

泛型类型的Linq类型转换

嗯。看到您得到的错误并不容易,但也许您需要.Cast<object>().ToList():

var data = dt.AsEnumerable()
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] })
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null))
    .Cast<object>()
    .ToList();

编辑这应该可以完美地工作,在REPL中测试:

csharp> new Dictionary<string, string> { {"key","value"} }.ToList().Cast<object>();
{ [key, value] }
csharp> new Dictionary<string, string> { {"key","value"} }.Cast<object>().ToList();               
{ [key, value] }
data = dt.AsEnumerable()
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] })
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null))
    .Select(x => (object)x)
    .ToList();

答案取决于您想要的结果:字典键,值,两者?

假设你想把这些值作为对象,下面的代码就可以了:

data = dt.AsEnumerable()
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] })
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null))
    .Select(x => (object)x.Value)
    .ToList();