2016-08-08 5 views
1

JObjectを構築するためにC#LINQを使用しようとしています。Linqを使用してKeyValueペアをNewtonsoft.Json.Linq.JObjectに変換します。

var jobj = new JObject(); 
foreach (var field in fieldList) 
{ 
    jobj[field.Name] = new JValue(field.Value); 
} 

ループをLINQに置き換えることはできますか?私は、これを試してみました

var data = fieldList.Select(field => new KeyValuePair<string, JValue>(field.Name, new JValue(field.Value))); 
var jobj = new JObject(data); 

が、それは、このエラーで失敗します。

Could not determine JSON object type for type System.Collections.Generic.KeyValuePair`2[ 
    System.String,Newtonsoft.Json.Linq.JValue]. 

答えて

1

jobj[field.Name] = new JValue(field.Value); 

あなたは実際には次JObjectインデクサ呼んでいる:すなわちあなたがJObjectプロパティを設定している

public JToken this[string propertyName] { get; set; } 

を。

だから、LINQと同等はこのようになります。

var data = fieldList.Select(field => new JProperty(field.Name, field.Value)); 
var jobj = new JObject(data); 
+1

恐ろしい!!!それは非常に役に立ちます。 'Select()'の前に 'Where()'を追加して、必要なフィールドだけを取得することもできました。 –

1

まあ、それはどんなきれいだ場合、私は知りませんが、あなたが集計を使用することができます。

fieldList.Aggregate(new JObject(), (obj, next) => {obj[next.Name] = new JValue(next.Value); return obj;}) 

JObjectが連鎖可能なAPIを持っていればいいかもしれませんが、そうは思われません。ここで

+0

私は、私が実際にこのコードをテストしていない、注意しなければならない...しかし、原理が有効である必要があります。あなたが 'reduce'をやろうとしているようです(リストを取得し、それを単一の値に減らす:JObject)。 –

関連する問題