分组,排序,然后合并到可观察的集合?

时间:2015-10-15 06:14:27

标签: c# sorting observablecollection

我有一个具有“DisplayOrder”属性的项目列表。这可以具有NULL或int值。如果它具有int值,则它具有优先级,并且应该位于Observable Collection的第一组中。第一组中的项目也按DisplayOrder排序。

如果为NULL,则它属于第二组,按字母顺序排序。

然后将第一组和第二组合并为一个主项目集合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);
}

谢谢!

3 个答案:

答案 0 :(得分:1)

当做这样的事情时,你不需要所有那些中间ObservableCollection - 你可以使用适当的数据结构,如数组,列表,字典,哈希集等或Linq查询。在这种特殊情况下,整个过程可以简化为这样的

var MainItemCollection = new ObservableCollection<MainItemViewModel>(DataObject.MainItems
    .OrderBy(item => item.DisplayOrder ?? int.MaxValue)
    .ThenBy(item => item.DisplayOrder == null ? item.Title : string.Empty)
);

答案 1 :(得分:1)

使用DisplayOrder获取项目= null&amp;按标题订购:

ItemsWithNullProperty=DataObject.MainItems.Where(x=>x.DisplayOrder==null).OrderBy(o=>o.Title).ToList();

使用DisplayOrder获取项目(除上述查询外的所有项目)&amp;通过DisplayOrder订购它们:

ItemsWithProperty= DataObject.MainItems.Except(ItemsWithNullProperty).OrderBy(o=>o.DisplayOrder).ToList();

在MainCollection中填写数据:

var allItems = MainItemCollection.Concat(ItemsWithProperty)
                                    .Concat(ItemsWithNullProperty)
                                    .ToList();

答案 2 :(得分:1)

我觉得这是一个很常见的情况。 某些XAML UI绑定了一个有序的ObservableCollection,一旦有更多数据可用,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++;
                }
            }
        }
    }
}