从List <idictionary <string,object>&gt;中选择不同的DateTime属性。使用LINQ

时间:2016-11-25 17:59:07

标签: c# linq datetime dynamic expandoobject

我有一个返回List<IDictionary<string,object>>的方法。

使用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";

从该方法返回的内容中,我需要选择&#34; DateTime属性1和#34;的不同值,但仅限于日期部分。所以,我试图做以下事情:

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

但它说没有ToShortDateString()这样的方法:

  

的IEnumerable&#39;不包含的定义   &#39; ToShortDateString&#39;没有扩展方法&#39; ToShortDateString&#39;   接受类型&#39; IEnumerable&#39;的第一个参数。可能   找到。

为属性分配object值时,为什么词典中的DateTime未自动转换为DateTime?当我在任何地方使用dynamic代替object时,一切正常。

使用object时如何使其正常工作?

1 个答案:

答案 0 :(得分:1)

您的方法返回List<IDictionary<string,object>>,因此当您访问Dictionary中的项目时,编译器会将其视为object,因此会检测到没有方法{{1在它上面定义。

如果您的方法返回ToShortDateString并且您以List<dynamic>方式访问元素,则编译器将不会检查dynamic是否存在,因此您将不会收到任何错误。< / p>

如果您知道 ToShortDateStrings["DateTime Property 1"],那么您可以简单地投出

DateTime

或者,您可以调用((DateTime)s["DateTime Property 1"]).ToShortDateString(); 然后解析结果

ToString