3

我有一个List<T>where Tis my Eventtype ,它有一个timetype字段long。此列表由 Web 服务填充,如果事件没有时间,则值设置为 0。

我想要做的是按时间升序对列表进行排序,但将时间= 0 的项目放在最底部。

目前,我正在以一种 hack 的方式完成此任务,并且我想学习一种更好的方法。

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

我尝试实现一个 custom 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

你应该这样做:

 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 回答
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 回答