从数据表转换到泛型列表的最快方法是什么?
本文关键字:方法 是什么 列表 数据表 转换 泛型 | 更新日期: 2023-09-27 18:05:40
我有一个基类,它有一个API,返回一个基于标识符的数据表,每个标识符都需要一个对象
我讨厌使用数据表,所以我想写一个映射代码,我只需要将属性映射到数据表中的特定字段。
有没有比我的例子更快的方法?
谢谢。
public abstract class BaseClass<T> where T : BaseClass<T>
{
protected abstract T MapObject(DataRow row);
protected abstract int SomeIdentifier { get; }
public IList<T> GetData()
{
return ConvertDataTableToGenericList(GetDataTableFromOtherSource(this.SomeIdentifier));
}
private IList<T> ConvertDataTableToGenericList(DataTable table)
{
IList<T> objectList = new List<T>();
foreach (DataRow row in table.Rows)
{
objectList.Add(MapObject(row));
}
return objectList;
}
}
public class DerivedClass : BaseClass<DerivedClass>
{
public int ID { get; set; }
protected override int SomeIdentifier
{
get { return 1; }
}
protected override DerivedClass MapObject(DataRow row)
{
return new DerivedClass()
{
ID = (int)row["ID"]
};
}
}
您可以更改您的接口以使用IEnumerable<T>
和yield return
的结果。整体性能不会提高,但您可以开始更快地处理结果。
作为示例:
private IEnumerable<T> ConvertDataTableToGenericList(DataTable table)
{
foreach (DataRow row in table.Rows)
{
yield return MapObject(row);
}
}
这是你想要的,也许不太好读?但是非常简洁。我不是LINQ专家,所以也许这可以清理一下。另外,不确定为什么要这样做…
//using System.Dynamic; <-- put this at the top
Linq<dynamic> list = (from r in table.AsEnumerable()
let eo = new ExpandoObject()
let blah = (dt.Columns.Cast<DataColumn>().All(dc => { ((IDictionary<string,object>eo).Add(dc.ColumnName, r[dc]); return true; }))
select eo).Cast<dynamic>().ToList();
Console.WriteLine(list[0].ID); //your first ID of your DataTable.
你觉得怎么样?