Странная сортировка DynamicData - PullRequest
1 голос
/ 11 марта 2020

Я думаю, что сортировка в DynamicData не работает должным образом. Может быть, я не понимаю, как его использовать? Пример:

using DynamicData;
using DynamicData.Binding;
using ReactiveUI;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;

namespace DynamicDataTest
{
    public class Element:ReactiveObject
    {
        string name;
        public string Name { get => name; set => this.RaiseAndSetIfChanged(ref name,value); }
        int val;
        public int Value { get => val; set => this.RaiseAndSetIfChanged(ref val, value); }    
    }

    public class CollectionTest:ReactiveObject
    {
        public SourceCache<Element, int> source = new SourceCache<Element, int>(e => e.Value);
        public ReadOnlyObservableCollection<string> Info;
        public void Print()
        {
            Console.WriteLine("Begin print");
            foreach (var obj in Info) Console.WriteLine(obj);
            Console.WriteLine("End print");
        }
        public CollectionTest()
        {
            source.AddOrUpdate(new Element() { Name = "Hello1", Value = 4 });
            source.AddOrUpdate(new Element() { Name = "Hello2", Value = 3 });
            var connection = source.Connect().Sort(SortExpressionComparer<Element>.Ascending(e => e.Value));
            connection.Transform(t=>t.Name).Bind(out Info).Subscribe();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var test = new CollectionTest();
            test.Print();
            test.source.AddOrUpdate(new Element() { Name = "Hello1", Value = 4 });
            test.source.AddOrUpdate(new Element() { Name = "Hello2", Value = 3 });
            test.Print();
        }
    }
}

Результат странный: первый порядок показа печати Hello2 Hello1, а второй - Hello1 Hello2. Что не так?

1 Ответ

1 голос
/ 11 марта 2020

При использовании исходного кэша сортировка выполняется только оператором bind, page и virtualise. Это из соображений производительности, так как состояние хранится в словаре, который не имеет понятия упорядочения. Поэтому вы должны применить сортировку непосредственно перед Bind.

С другой стороны, для списка источников состояние хранится в списке, который понимает порядок из-за его индексации. В этом случае сортировка может быть применена в любом месте цепочки.

...