2017-05-16 3 views
1

これは私の質問だったので、それを解決してみんなと共有することにしました。リストで検索するには<classtype> Cのクラスの動的フィールド名で

私は私のドライバクラスのリストを持っています。私はDBからデータをロード

は、その後のDataGridViewに表示:コンボボックスで

List<driver> list = DriverList(); 
dgvListDrivers.DataSource = list; 

負荷フィールド名:以下

List<ColNameText> l = new List<ColNameText>(); 
foreach (DataGridViewColumn item in dgvListDrivers.Columns) 
{ 
    ColNameText cnt=new ColNameText(); 
    cnt.colname=item.Name; 
    cnt.displaytext=item.HeaderText; 
    l.Add(cnt); 
} 
comboBoxEx1.DataSource=l.ToList(); 
comboBoxEx1.DisplayMember = "displaytext"; 

がColNameTextクラスDefinatonです:今、私が欲しい

class ColNameText 
    { 
     public string colname { get; set; } 
     public string displaytext { get; set; } 
    } 

ドライバクラスプロパティによってリスト内を検索できるようにする。

私が検索した解決策はたくさんありましたが、私が望む方法ではありませんでした。

答えて

0

以下は、あなたのリストで検索できる最も簡単な方法です。 textbox_textchangeイベントで このhappents:

static List<T> FindWhereMemberContains<T>(this List<T> list, 
    string memberName, string value) 
{ 
    var p = Expression.Parameter(typeof(T)); 
    var lambda = Expression.Lambda<Predicate<T>>(Expression.Call(
     Expression.Call(Expression.PropertyOrField(p, memberName), "ToString", null), 
     "Contains", null, Expression.Constant(value, typeof(string))), p); 
    return list.FindAll(lambda.Compile()); 
} 

付::大規模なリストについては

dgvListDrivers.DataSource = list.FindWhereMemberContains(p.colname, txtSearch.Text); 

、これはかなり速くなります

private void txtSearch_TextChanged(object sender, EventArgs e) 
    { 
     var p =(ColNameText) comboBoxEx1.SelectedItem; 
     var result= from q in list where q.GetType().GetProperty(p.colname).GetValue(q,null).ToString().Contains(txtSearch.Text) select q; 
     dgvListDrivers.DataSource = result.ToList(); 

    } 
+0

注:あなたが生のリフレクションを使用する場合は、*本当に*(メンバーのルックアップ、すなわち 'VARプロパティ= typeof演算を掲げなければなりませんドライバ).GetProperty(p.colname) 'を起動時のどこかに置いて、それを何度も使用してください。完璧な世界では、 'GetGetMethod()'と 'Delegate.CreateDelegate'を使ってそれをさらに最適化します: –

1

これは何かLINQ式のように見えるがで助けることができます生の反射よりも;小さなリストの場合、基本的なリフレクション(メタプログラミングオーバーヘッドなし)が高速になる可能性があります。テストする必要があります。

非表現が、それでも、こののではない、あまりにも悪いバージョンは次のようになります。

static List<T> FindWherePropertyContains<T>(this List<T> list, 
    string propertyName, string value) 
{ 
    var property = (Func<T, object>)Delegate.CreateDelegate(typeof(Func<T, object>), 
     typeof(T).GetProperty(propertyName).GetGetMethod()); 
    return list.FindAll(x => property(x).ToString().Contains(value)); 
} 
+0

あなたはプロセス時間についてあなたの権利を考えると、それは巨大なデータで試されるべきです。返信ありがとう –

関連する問題