2013-07-01 2 views
0

Это мой код:C# - Не удалось сравнить два элемента в массиве

var distinctDateValues = dt.AsEnumerable() 
        .Select(row => new 
        { 
         Date = DateTime.Parse(row.Field<string>("DAY")) 
        }) 
        .Distinct() 
        .ToList(); 

distinctDateValues.Sort(); // getting error on this line 

Значения в distinctDateValues ​​являются:

enter image description here

Ошибка я получаю «Не удалось сравнить два элементов в массиве ".

Может кто-нибудь предложить мне, как я здесь делаю неправильно. Я хочу сортировать значения в столбце date для defineDateValues.

+1

Вам действительно нужно перечисление анонимных объектов только с одним полем ('Date')? Вы можете просто поместить значения 'DateTime' в ваше перечисление напрямую. –

+1

Почему не 'OrderBy' с Linq? –

+0

Чтобы выполнить 'Сортировка' в' List ', каждый раз, когда у вас есть два элемента из списка, алгоритм должен иметь возможность определить, какой из них больше другого. Это требует, чтобы (один из двух) объектов реализовал «IComparable», «IComparable » или аналогичный. Вы используете анонимный тип, потому что используйте 'new {Date = xxx}'. В то время как анонимные типы переопределяют 'Equals' и' GetHashCode', они не реализуют 'IComparable' или аналогичные. Поэтому вы можете сказать, что два экземпляра анонимного типа равны или нет, но вы не можете сказать, является ли он «больше, чем» другим! –

ответ

4

Излишне создать анонимный тип, в вашем случае результат distinctDateValues список анонимного типа, а не список DateTime, вы должны получить отсортированный список DateTime, как показано ниже с OrderBy:

var distinctDateValues = dt.AsEnumerable() 
       .Select(row => row.Field<DateTime>("DAY")) 
       .Distinct() 
       .OrderBy(x => x) 
       .ToList(); 

Кроме того, вы должны использовать встроенный метод Field<DateTime> вместо того, чтобы использовать еще один шаг с DateTime.Parse

2

Просто угадать здесь ... ваш distinctDateValues не кп ой, как сравнивать себя ... Вы должны были бы реализовать IComparable или что-то ...

Попробуйте это:

var distinctDateValues = dt.AsEnumerable() 
       .Select(row => DateTime.Parse(row.Field<string>("DAY"))) 
       .Distinct() 
       .ToList(); 

distinctDateValues.Sort(); // should not get any errors here... 

Если вы действительно хотите создать анонимный тип (например, вы только показываете нам небольшая часть вашего кода), попробуйте следующее:

var distinctDateValues = dt.AsEnumerable() 
       .Select(row => new 
       { 
        Date = DateTime.Parse(row.Field<string>("DAY")) 
       })  
       .Distinct() 
       .OrderBy(d => d.Date) // do the sorting here with linq 
       .ToList(); 
Смежные вопросы