2016-11-25 3 views
1

У меня есть метод, который возвращает List<IDictionary<string,object>>.Выберите различные свойства DateTime из списка <IDictionary <string, object >> using 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"; 

Из того, что возвращает метод, мне нужно, чтобы выбрать различные значения «DateTime свойства 1», но только на дату его части. Таким образом, я пытаюсь сделать следующее:

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

Но он говорит, что не существует такой метод, как ToShortDateString():

IEnumerable»не содержит определения для „ToShortDateString“и нет метод расширения 'ToShortDateString' Принятие первого аргумента типа «IEnumerable» может быть найдено .

Почему object в словаре не преобразуется в DateTime типа автоматически, когда свойство присваивается значение DateTime? Когда я использую dynamic везде, а не object, все работает отлично.

Как это сделать, если используется object?

ответ

1

Ваш метод возвращает List<IDictionary<string,object>>, поэтому, когда вы доступ к элементу в Dictionary, компилятор будет рассматривать его как object и так будет обнаружить, что не существует никакого метода ToShortDateString определяется на нем.

Если метод возвращает вместо List<dynamic> и вы получаете доступ к элементу как dynamic, компилятор не проверяет, существует ли или нет ToShortDateString, и поэтому вы не получите никаких ошибок.

Если вы знаетеs["DateTime Property 1"] является DateTime, то вы можете просто бросить его

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

В качестве альтернативы, вы можете вызвать ToString затем проанализировать результат

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

Да, "DateTime Property 1" имеет тип 'DateTime'. Он вычисляется 'DateTimeOffset.Parse (JTokenValue.ToString()). DateTime' в рамках метода, упомянутого выше. Попытка использовать 'DateTime' не помогла: ошибка в методе' ToShortDateString() 'по-прежнему сохраняется. Вызов 'ToString()' перед 'ToShortDateString()' не работает как 'ToShortDateString()' ожидает 'DateTime' как аргумент, а не' string' (появляется ошибка об этом). – YMM

+0

можете ли вы включить код, который вы использовали для перевода в 'DateTime'? – KMoussa

+0

'var unique = GetData(). Выберите (s => (DateTime) s [" Свойство DateTime 1 "]. ToShortDateString()). Distinct();' – YMM