名单的自定义排序(Custom Sorting of List)

2019-06-25 07:35发布

我有一个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;
    }
}

指导表示赞赏!

谢谢!

Answer 1:

尝试

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


Answer 2:

你可以使用LINQ:

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


Answer 3:

你应该做这样的事情:

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

这里的关键是,0比任何时候都大,所以它会被放置在列表的末尾。



Answer 4:

您的自定义的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);


Answer 5:

试试这个(你必须调整它为您的需求):

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


文章来源: Custom Sorting of List