2016-11-25 4 views
1

List<IDictionary<string,object>>を返すメソッドがあります。リストから別のDateTimeプロパティを選択する<IDictionary <string、object >> LINQを使用

辞書のオブジェクトはExpandoObjectを使用して作成され、foreachループでリストに追加されます。ここでは、そのようなオブジェクトの例である:どのようなメソッドが返すから

var dataItem = new ExpandoObject() as IDictionary<string, object>; 
dataItem["String Property 1"] = "String Value 1"; 
dataItem["String Property 2"] = "String Value 2"; 
dataItem["DateTime Property 1"] = "DateTime Value 1"; 
dataItem["DateTime Property 2"] = "DateTime Value 2"; 

、私はそれだけの日付の部分について、「日時プロパティ1」の異なる値を選択する必要があります。

var unique = GetData().Select(s => s["DateTime Property 1"].ToShortDateString()).Distinct(); 

しかし、それはToShortDateString()としてはそのような方法が存在しないことを言う::だから、私は、次の操作を実行しようとしている

IEnumerableをToShortDateString 『」 の定義が含まれていない』となし拡張メソッド 'ToShortDateString' 'IEnumerable'タイプの最初の引数を受け入れることができます が見つかりました。

はなぜ辞書に objectは、プロパティが DateTime値が代入されたときに自動的に DateTime型に変換されていませんか? objectの代わりにどこでも dynamicを使用すると、すべて正常に動作します。

objectを使用するとどうすればよいですか?

答えて

1

あなたの方法は、List<IDictionary<string,object>>を返すので、あなたがDictionary内のアイテムにアクセスすると、コンパイラはobjectとして扱いますので、それに定義された方法ToShortDateStringがないことを検出します。

代わりにメソッドがList<dynamic>を返し、要素にdynamicとしてアクセスすると、コンパイラはToShortDateStringが存在するかどうかをチェックしないため、エラーは発生しません。

あなたがs["DateTime Property 1"]を知って場合は、あなたは、単にその後、

DateTime.Parse(s["DateTime Property 1"].ToString()).ToShortDateString(); 
+0

はい、 "日時プロパティ1" の結果を解析し、あなたがToStringを呼び出すことができます

((DateTime)s["DateTime Property 1"]).ToShortDateString(); 

代わりにキャストすることができ、DateTimeですタイプは「DateTime」です。これは、上記のメソッド内の 'DateTimeOffset.Parse(JTokenValue.ToString())。DateTime'によって計算されます。 'DateTime'をキャストしようとしても役に立たなかった:' ToShortDateString() 'メソッドが見つからないというエラーは依然として残っています。 'ToShortDateString()'の前に 'ToString()'を呼び出すと動作しません。 'ToShortDateString()'は 'string'ではなく' DateTime'を引数として想定しています。 – YMM

+0

「DateTime」にキャストするために使用したコードを含めることができますか? – KMoussa

+0

'var unique = GetData().Var unique = GetData()。選択(s =>(DateTime)s [" DateTimeプロパティ1 "] ToShortDateString())Distinct();' – YMM

関連する問題