List 的自定义排序

我有一个List ,其中T是我的Event类型,其字段time类型为long 。 此列表从Web服务填充,如果事件没有时间,则值设置为0。

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

目前我正以一种时尚的方式实现这一目标,我想学习更好的方法。

 var events = new ObservableCollection(); var resp = JsonConvert.DeserializeObject(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 { public int Compare(Event x, Event y) { if (x.time == 0) return 0; if (x.time  y.time) return 1; return 0; } } 

指导表示赞赏!

谢谢!

尝试

  events.OrderBy (e => e.Time == 0).ThenBy (e => e.Time); 

您可以使用LINQ:

 resp.OrderBy(i => i.time == 0 ? int.MaxValue : i.time); 

你应该做这样的事情:

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

这里的要点是0大于任何其他时间,因此它将被放置在列表的末尾。

您的自定义IComparer不正确。 使用正确的逻辑,它应该工作得很好。 问题是如果左值为零,任何值都将等于它。 这意味着0 == 3为真, 3 > 0为真。 实际上, 0 > 33 < 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); 

试试这个(你必须根据自己的需要调整它):

  class Comparer : IComparer { 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; } }