分组,排序,然后合并到一个可观察集合
本文关键字:一个 观察 集合 然后 排序 合并 分组 | 更新日期: 2023-09-27 18:17:51
我有一个具有"DisplayOrder"属性的项目列表。它可以是NULL或int值。如果它的值是int,它就有优先级,应该在Observable Collection的第一组中。第一组中的项目也按DisplayOrder排序。
如果它是NULL,那么它属于第二组,按字母顺序排序。
第一组和第二组然后组合成一个Main Items Collection Observable Collection,我将它绑定到ListView。
这是我当前的代码,尽管我担心是否有更优的方法来做它。
var MainItemCollection = new ObservableCollection<MainItemViewModel>();
var ItemsWithProperty = new ObservableCollection<MainItemViewModel>();
var ItemsWithNullProperty = new ObservableCollection<MainItemViewModel>();
foreach (var item in DataObject.MainItems)
{
if (item.DisplayOrder == null)
ItemsWithNullProperty.Add(new MainItemViewModel(item));
else
ItemsWithProperty.Add(new MainItemViewModel(item));
}
ItemsWithProperty = new ObservableCollection<MainItemViewModel>(ItemsWithProperty.OrderBy(c => c.DisplayOrder));
ItemsWithNullProperty = new ObservableCollection<MainItemViewModel>(ItemsWithNullProperty.OrderBy(c => c.Title));
//Add those with priorities first sorted by DisplayOrder 1,2,3,4
foreach (var c in ItemsWithProperty)
{
MainItemCollection.Add(c);
}
//Add those without priority sorted Alphabetically
foreach (var c in ItemsWithNullProperty)
{
MainItemCollection.Add(c);
}
谢谢!
获取DisplayOrder=null &按标题排序:
ItemsWithNullProperty=DataObject.MainItems.Where(x=>x.DisplayOrder==null).OrderBy(o=>o.Title).ToList();
获取具有DisplayOrder的项目(除上述查询外的所有项目)&按DisplayOrder:
排序ItemsWithProperty= DataObject.MainItems.Except(ItemsWithNullProperty).OrderBy(o=>o.DisplayOrder).ToList();
填写MainCollection:
中的数据var allItems = MainItemCollection.Concat(ItemsWithProperty)
.Concat(ItemsWithNullProperty)
.ToList();
当做这样的事情时,你不需要所有这些中间的ObservableCollection
-你可以使用适当的数据结构,如数组,列表,字典,哈希集等或Linq查询。在这种特殊情况下,整个过程可以简化为如下内容
var MainItemCollection = new ObservableCollection<MainItemViewModel>(DataObject.MainItems
.OrderBy(item => item.DisplayOrder ?? int.MaxValue)
.ThenBy(item => item.DisplayOrder == null ? item.Title : string.Empty)
);
我觉得这是一个非常常见的场景。有一个已排序的ObservableCollection绑定到一些XAML UI上,一旦有更多的数据可用,UI就需要更新,而不需要完全刷新。每当新的ObservableCollection被创建,就像上面的建议,所有的项目将被反弹,因此UI完全更新。
我很惊讶没有库方法来实现这一点。这是我想到的解决办法。希望有人会觉得有用。
public static class ObservableCollectionExtensions
{
public static void MergeSortedListIntoSortedObservableCollection<T>(this ObservableCollection<T> destination, IList<T> list, Func<T, T, int> compareFunc)
{
int dest_index = 0;
int list_index = 0;
while (list_index < list.Count)
{
if (dest_index >= destination.Count)
{
destination.Add(list[list_index]);
list_index++;
dest_index++;
}
else
{
if (compareFunc(destination[dest_index], list[list_index]) > 0)
{
destination.Insert(dest_index, list[list_index]);
list_index++;
dest_index++;
}
else
{
dest_index++;
}
}
}
}
}