3

我正在尝试运行此查询,但它给了我异常。

“至少一个对象必须实现 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))

4

3 回答 3

5

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

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

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

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

于 2013-10-04T07:25:10.403 回答
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))
);
于 2013-10-04T08:48:30.517 回答
0

根据 LINQ 基础知识,
如果您使用EventList,则必须实现 Icomparable 才能使用distinctOrderby

我确定您的查询在 OrderbY 行中断,但它显示在下一行

于 2013-10-04T07:38:59.627 回答