2011-08-16 12 views
1

私は識別子に基づいてDataTableを返すAPIを持つ基本クラスを持っています そして、私は各識別子のオブジェクトを持つ必要があります。DataTableから汎用リストに変換する最も速い方法は何ですか?

私はデータテーブルで作業することを嫌っています。そのため、マッピングコード を書いて、データテーブルの特定のフィールドにプロパティをマップするだけでした。

私の例ではなく、もっと速い方法がありますか?

ありがとうございました。

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"] 
     }; 
    } 
} 
+0

明らかなボトルネックはありません。ただし、テーブルのRowCountを知っているので、その開始容量でリストを構築することができます。アイテムの数が多い場合(これは実際のマイクロマイクロ最適化であり、パフォーマンスの差が顕著ではないと思われます)、リストにいくつかの再割り当てを保存します。 – driis

答えて

2

あなたがIEnumerable<T>yield return結果で動作するようにあなたのインターフェースを変更することができます。全体のパフォーマンスは向上しませんが、結果を処理するためにはより早く開始することができます。試料として

private IEnumerable<T> ConvertDataTableToGenericList(DataTable table) 
{ 
    foreach (DataRow row in table.Rows) 
    { 
     yield return MapObject(row); 
    } 
} 
0

これが読み取り可能ではないかもしれない、何をしたいですか?しかし、非常に簡潔です。私は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. 

あなたはどう思いますか?

+0

私はLINQの専門家でもなく、あなたがここで何をしたのかよく分かりませんでした... – Amir

関連する問題