首页 > 解决方案 > 按时间顺序在列表中插入对象

问题描述

我有一个列表,其中包含具有DateTime属性的对象。使用 aDataPicker和 aTimePicker创建一个DateTime对象,然后将其插入到ObservableCollection<>. 但是,我想相对于DateTime. 如何找到合适的位置将其放入列表中?

 public class HumorDiary
 {
    public DateTime Dt { get; set; }
 }

HumorDiary obj= new HumorDiary();
obj.Dt= xx/xx/xxxx;

ObservableCollection<HumorDiary> listDiario = new ObservableCollection<HumorDiary>();
    
listDiario.Insert(Position????, obj);

标签: c#xamarin.forms

解决方案


(测试代码后编辑答案。)

您可以自己对列表进行排序。

listDario.Add(obj);
listDario = new ObservableCollection<HumorDiary>(listDario.OrderBy(x => x.Dt));

令我惊讶的是,这实际上并没有触发额外的CollectionChanged事件。但是,请注意,这会创建一个新列表,并且附加到该列表的事件处理程序可能会被取消链接。我还要说它不是非常有效。如果您根本不需要事件功能,请SortedList<TKey,TValue>改用。

您也可以编写如下所示的扩展方法,但它假定列表已经排序,因此您必须确保每次插入都使用它。

    public static void InsertByDate(this ObservableCollection<HumorDiary> source, HumorDiary obj)
    {
        int idx = 0;
        while (idx < source.Count() && source[idx].Dt <= obj.Dt) {
            idx += 1;
        }
        source.Insert(idx, obj);
    }

推荐阅读