3

typeのフィールドを持つ where is my typeがList<T>ありTます。このリストは Web サービスから取り込まれ、イベントに時間がない場合、設定される値は 0 です。 Eventtimelong

私がやりたいのは、リストを時間の昇順で並べ替えることですが、時間= 0のアイテムを一番下に配置します。

現在、私はハックのような方法でこれを達成しており、より良い方法を学びたいと思っています.

var events = new ObservableCollection<Event>();
var resp = JsonConvert.DeserializeObject<Events>(restResponse.Content).Items;

var notime = resp.Where(r => r.time == 0);
var yestime = resp.Where(r => r.time > 0);

yestime.ToList().ForEach(events.Add);
notime.ToList().ForEach(events.Add);

CallbackInternal(callback, events);

私はカスタムを実装しようとしましたIComparerが、うまくいきませんでした(これはその一例です)

public class EventComparer : IComparer<Event>
{
    public int Compare(Event x, Event y)
    {
        if (x.time == 0) return 0;
        if (x.time < y.time) return -1;
        if (x.time > y.time) return 1;
        return 0;
    }
}

ご指導よろしくお願いします!

ありがとう!

4

5 に答える 5

11

試す

   events.OrderBy (e => e.Time == 0).ThenBy (e => e.Time);
于 2012-04-06T21:33:23.307 に答える
2

LINQ を使用できます。

resp.OrderBy(i => i.time == 0 ? int.MaxValue : i.time);
于 2012-04-06T21:31:57.037 に答える
1

カスタム IComparer が正しくありません。正しいロジックがあれば、問題なく動作するはずです。問題は、左の値がゼロの場合、どの値もそれに等しくなるということです。これは、それ0 == 3が真実であり、真実であることを意味し3 > 0ます。実際、0 > 3そして真実で3 < 0あるべきです

代わりに次のようにする必要があります。

if (x.time == y.time) return 0;
if (x.time == 0) return 1;
if (y.time == 0) return -1;
return x.time.CompareTo(y.time);
于 2012-04-06T21:32:24.557 に答える
1

これを試してください(必要に応じて調整する必要があります):

    class Comparer : IComparer<int>
    {
        public int Compare(int x, int y)
        {
            if (x == y) return 0;
            else if (x == 0) return 1;
            else if (y == 0) return -1;
            else if (x < y) return -1;
            else if (x > y) return 1;
        }
    }
于 2012-04-06T21:34:37.443 に答える
1

次のようにする必要があります。

 if(x.time==y.time) return 0;
 if(x.time==0) return 1;
 return x.time - y.time;

ここでのポイントは、0 が他の時間よりも大きいため、リストの最後に配置されることです。

于 2012-04-06T21:30:01.967 に答える