2013-10-04 4 views
3

Я пытаюсь запустить этот запрос, но это дает мне исключение.В чем проблема с этим запросом LINQ?

«По крайней мере, один объект должен выполнять IComparable».

Я не хочу, чтобы заказать/отличие от моего пользовательского объекта, а просто строкой (v.Venue). Однако аналогичный запрос с пользовательским объектом (вместо строки), который не реализует IComparable, отлично работает.

вот мой запрос:

new ObservableCollection<KeyValuePair<int, string>>(
    EventsList.Where(p => !string.IsNullOrEmpty(p.Venue)) 
    .Distinct() 
    .OrderBy(i => i) 
    .Select((v, index) => new KeyValuePair<int, String>(index, v.Venue)) 
); 

EventsList является ObservableCollection<EventSchedules>

Кроме того, я пытался разорвать весь запрос на куски, но она не только для последнего запроса:

Select((v, index) => new KeyValuePair<int, String>(index, v.Venue))

+2

Что такое 'EventsList'? Вы пытаетесь заказать его, но он не реализует «IComparable», поэтому он не знает, как это сделать. – CodingIntrigue

+0

@RGraham its an ObservableCollection Ankit

+3

«Однако подобный запрос с пользовательским объектом (вместо строки), который не реализует IComparable, отлично работает». Я очень сомневаюсь в этом. Как вы ожидаете сравнения двух объектов EventSchedule для заказа? Вы действительно пытались заказать место? –

ответ

0

Я решил ее проанализировав мой вопрос, я не хочу, чтобы отсортировать на мой пользовательский объект (EventSchedule), как другие предложили , То, что я хотел заказать &, является строкой. Поэтому я изменил мой запрос как:

new ObservableCollection<KeyValuePair<int, string>>(
EventsList.Where(p => !string.IsNullOrEmpty(p.Venue)) 
.Select(p => p.Venue) //added this 
.Distinct() 
.OrderBy(i => i) 
.Select((v, index) => new KeyValuePair<int, String>(index, v)) 
); 
5

EventList объект должен реализовать IComparable, чтобы xecute Distinct() и OrderBy() функции. Linq должен знать, как сравнивать экземпляры EventList, чтобы отсортировать их и удалить дубликаты.

Комментарий ответ: Вы можете заказать и сделать отчетливо на p.Venue. I.e .:

new ObservableCollection<KeyValuePair<int, string>>(
    EventsList.Where(p => !string.IsNullOrEmpty(p.Venue)) 
    .GroupBy(p => p.Venue) 
    .Select(grp => grp.First()) // These two lines are lambda way to say Distinct. 
    .OrderBy(p => p.Venue) 
    .Select((v, index) => new KeyValuePair<int, String>(index, v.Venue)) 
); 

Или вы можете реализовать пользовательский компаратор.

+0

, как я могу это сделать, его ObservableCollection – Ankit

+0

@ ay89, yep, но он не говорит об ObservableCollection, но о объекте EventList ..... – walther

+0

Мы уверены, что это не EventSchedules, который должен реализовать IComparable? – Gusdor

0

Согласно основам LINQ,
Если вы используете EventList вы должны реализовать IComparable использовать отчетливый и OrderBy.

Я уверен, что ваш запрос разбивается на OrderBy линии, но это показывает, на следующей строке

Смежные вопросы