2017-02-24 8 views
3

リストを辞書に変換する必要があります。これは私がオブジェクトとその子オブジェクト/リストを反復処理し、それらを接続するいくつかのコードを作成していて、私は、idフィールドの名前がわからない、次の構文リストを文字列を使って辞書に変換する式c#

var dictionary = myList.ToDictionary(e => e.Id); 

を使用してC#で行うことができます私のdbcontext。

Iすでに私のキー値であるプロパティの名前を決定するためのコードを持っているが、テストのために私はちょうど「ID」を使用することができます(他は異なる場合があります)

だから私は基本的にこの文字列を作成する必要があります」 c => e.Id "をFuncに渡しますが、Expressionオブジェクトのパラメータがわかりません。

は、これまでのところ私は式の専門家であるこの

public static Expression<Func<T, bool>> strToFunc<T>(string propName) 
{ 
    Expression<Func<T, bool>> func = null; 

     var prop = typeof(T).GetProperty(propName); 
     ParameterExpression tpe = Expression.Parameter(typeof(T)); 
     var left = Expression.Property(tpe, prop); 


    return func; 
} 

誰かが、あなたの助けを本当に感謝しています。私はあなたの質問を理解している場合、これは私はそれを行うだろうかで事前

+0

はたぶん、[動的なLINQ](https://dynamiclinq.codeplex.com/)を見てみましょう。それはちょうどあなたが探しているものかもしれません。 – Mats391

+1

テストプログラムで 'Expression > tmp = x => x.SomeProperty;'とすると、デバッガで 'tmp'オブジェクトを見ることができます。あなたが必要とする作品。また、なぜあなたの関数 ''を表現しようとしていますか? '' –

+1

私は疑問を誤解しているが、キー値を含むプロパティの名前を知っていれば訂正します、 'var dictionary = myList.ToDictionary(e => e.GetType()。GetProperty(propName).GetValue(e));'のようなことをやめさせるのは何ですか? – Innat3

答えて

0

おかげで、いない場合、それはいくつかの方法が役立ちます願っています。

public static Dictionary<object, TValue> GenericToDictionary<TValue>(this IEnumerable<TValue> source, string propName) 
{ 
    Dictionary<object, TValue> result = new Dictionary<object, TValue>(); 
    foreach (var obj in source) 
    { 
     result[obj.GetType().GetProperty(propName).GetValue(obj)] = obj; 
    } 
    return result; 
} 
0

プロパティ名が文字列である場合は、これを試すことができます。

public static Dictionary<string, T> ListToDictionary<T>(string propertyName, List<T> list) 
    { 
     Func<T, string> func = obj => typeof(T).GetProperty(propertyName).GetValue(obj) as string; 
     return list.ToDictionary(func); 
    } 

そうしないと、あなただけのラムダに式を渡すことができます。

class Person 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 

    public static void DoSomething() 
    { 
     var people = new List<Person>(); 
     var dict = people.ToDictionary(p => p.ID); 
    } 
関連する問題