这个LINQ查询的问题是什么?

时间:2013-10-04 07:18:13

标签: c# 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))
);

EventsListObservableCollection<EventSchedules>

此外,我尝试将整个查询分解为多个部分,但它仅针对最后一个查询失败:

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

3 个答案:

答案 0 :(得分:5)

EventList对象必须实现IComparable才能执行Distinct()OrderBy()函数。 Linq需要知道如何比较EventList的实例,以便对它们进行排序并删除重复项。

评论答案: 您可以通过p.Venue订购和区分。即:

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))
);

或者您可以实现自定义比较器。

答案 1 :(得分:0)

根据LINQ基础知识,
如果您使用 EventList ,则必须实施Icomparable以使用不同排序

我确信您的查询在OrderbY行中突破,但它显示在Next Line

答案 2 :(得分:0)

我在分析了我的查询后解决了它,我不想像其他人建议的那样对我的自定义对象(EventSchedule)进行排序。我想订购什么&amp; distinct是一个字符串。所以我将我的查询重新排列为:

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))
);