我有List<T>
其中T
是我的Event
类型,其字段time
的类型为long
。此列表是从Web服务填充的,如果事件没有时间,则值设置为0.
我想要做的是按时间按升序对列表进行排序,但是在最底部放置时间= 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;
}
}
指导表示赞赏!
谢谢!
答案 0 :(得分:11)
尝试
events.OrderBy (e => e.Time == 0).ThenBy (e => e.Time);
答案 1 :(得分:2)
您可以使用LINQ:
resp.OrderBy(i => i.time == 0 ? int.MaxValue : i.time);
答案 2 :(得分:1)
你应该这样做:
if(x.time==y.time) return 0;
if(x.time==0) return 1;
return x.time - y.time;
这里的要点是0比任何其他时间都大,所以它将被放在列表的末尾。
答案 3 :(得分: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);
答案 4 :(得分: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;
}
}