3

このクエリを実行しようとしていますが、例外が発生します。

「少なくとも 1 つのオブジェクトが 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を実行するために実装する必要があります。Linq は、インスタンスを並べ替えて重複を削除するために、インスタンスを比較する方法を知る必要があります。Distinct()OrderBy()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))
);

または、カスタム比較子を実装できます。

于 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 に答える