2016-10-24 26 views
2

order byを使用した後にタイトルが記述されているためです。少なくとも1つのオブジェクトでIComparableの注文を実装する必要があります

なステートメントによって順序は次のようになります。

var fahrerGroups = dispoLinien.OrderBy(dl => dl.Linie.GetValidLinienVersionByDate(date).Fahrten.Select(f => f.Beginn)).GroupBy(dl => dl.GetValidDispolinienVersionByDate(date).Fahrer); 

日は常に現在の日付です。

サービスの開始時間で注文しようとしています。私のステートメントはオブジェクト型を返し、オブジェクトはIComparableを実装していないため、エラーが発生したことが分かりました。私が理解できなかった点は、オブジェクト型ではなくdateTimeをソートしようとしていることです。

+0

ある時点で閉じ括弧が欠けていると思います。今はLinqのクエリ(Selectなど)で注文しています。 – Kilazur

+0

私は高い照明でカッコを見ており、正しい場所にあります。最初にラムダ式を実行してリストを選択し、リストのタイプで定義されている関数を使用します。この関数は、このリストのvaildバージョンを返します。その後、バージョンでリストを選択し、注文する必要がある開始時刻を選択します – venter

答えて

1

選択は多分IEnumarable

を返し、あなたはあなたのリストをソートする最初の要素を選択することができます。

I追加FirstOrDefault;

var fahrerGroups = dispoLinien 
     .OrderBy(dl => dl 
     .Linie 
     .GetValidLinienVersionByDate(date) 
     .Fahrten 
     .Select(f => f.Beginn) 
     .FirstOrDefault()) 
     .GroupBy(dl => dl 
     .GetValidDispolinienVersionByDate(date) 
     .Fahrer); 
0

それはあなたがFahrtのBeginnの昇順でdispoLinienのあなたの順序を注文しようとしますが、Beginn Fahrtシーケンスの昇順ではありませんようです。 2つのBegin Fahrt Sequence間の比較は定義していません。

難しいOrderByステートメントを小さなステップに分割して、このOrderByの各部分のタイプをチェックしました。 あなたのdispoLinienの最初の要素に対してこれを行いましょう:

var dl = dispoLinien.First(); var linienVersion = dl.Linie.GetValidLinienVersionByDate(date);

linienVersionのタイプは教えていませんが、返されるlinienVersionには、IEnumerableを実装するタイプのプロパティFahrtenがあります。言い換えれば:dlと日付から、あなたはFahrtsのシーケンスとしてlinienVersionを得ることができます。

IEnumerable<Fahrt> fahrten = linienVersion.Fahrten. 
var fahrtBeginns = fahrten 
    .Select(fahrt => fahrt.Beginn); 

各dlから、ファールツの始まりのコレクションを抽出します。

結果は、ファーリッツの始まりのコレクションの昇順でコレクションを注文したいということです。

私はこれがあなたが望むものではないと確信しています。あなたがBeginn Fahrtsの昇順であなたのdispLinienを注文したい場合は、すべてのDLのために、すべてのFahrtsの早いを取得する必要があります:

var orderedDispoLinien = dispoLinien.OrderBy(dispoLinie => 
    dispoLinie.Linie.GetValidLinienVersionByDate(date) 
     .Fahrten      // get only Fahrten 
     .Where(fahrt => fahrt.Any() // that are not empty 
     .Select(fahrt => fahrt.Beginn) // from each fahrt take Beginn 
     .Min(beginn => beginn));  // and use the earliest Beginn Fahrt 

今、あなたがいることを意味し、最小のBeginn Fahrtの昇順であなたのdispoLinienをソートしています最も早いAbfahrtを持つdispoLinieが最初です。

GroupByは結果のグループの順序を指定しないため、グループ化する前にOrderByに意味をなさない。順序付けされた結果が必要な場合は、OrderByをGroupByの後に配置する必要があります。

関連する問題