从数据表转换到泛型列表的最快方法是什么?

本文关键字:方法 是什么 列表 数据表 转换 泛型 | 更新日期: 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.

你觉得怎么样?