Skip to content

Commit c1870d3

Browse files
Ensure comparer changed is subscribed to before data changed for list. Fixes reactivemarbles#473 (reactivemarbles#476)
1 parent c6234b0 commit c1870d3

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

src/DynamicData.Tests/List/SortFixture.cs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics.CodeAnalysis;
34
using System.Linq;
4-
5+
using System.Reactive.Subjects;
56
using DynamicData.Binding;
67
using DynamicData.Tests.Domain;
78

@@ -11,6 +12,50 @@
1112

1213
namespace DynamicData.Tests.List
1314
{
15+
public class SortChangedFixture
16+
{
17+
private static readonly IComparer<ListItem> DefaultComparer = SortExpressionComparer<ListItem>.Ascending(x => x.Number);
18+
19+
20+
/// <summary>
21+
/// See https://github.com/reactivemarbles/DynamicData/issues/473
22+
/// </summary>
23+
[Fact]
24+
public void SortsWithoutError()
25+
{
26+
var source = new SourceList<ListItem>();
27+
var sorter = new Subject<IComparer<ListItem>>();
28+
29+
source.AddRange(Enumerable.Range(1, 10).Select(i => new ListItem(i)));
30+
31+
source.Connect()
32+
.Sort(sorter)
33+
.Bind(out var bound)
34+
.Subscribe();
35+
36+
bound.Select(x => x.Number).Should().BeInAscendingOrder();
37+
38+
sorter.OnNext(SortExpressionComparer<ListItem>.Descending(x => x.Number));
39+
40+
41+
bound.Select(x => x.Number).Should().BeInDescendingOrder();
42+
}
43+
44+
45+
private class ListItem : IComparable<ListItem>
46+
{
47+
public int Number { get; }
48+
49+
public ListItem(int number)
50+
{
51+
Number = number;
52+
}
53+
54+
public int CompareTo([AllowNull] ListItem other) => DefaultComparer.Compare(this, other);
55+
56+
}
57+
}
58+
1459
public class SortFixture : IDisposable
1560
{
1661
private readonly IComparer<Person> _comparer = SortExpressionComparer<Person>.Ascending(p => p.Name).ThenByAscending(p => p.Age);

src/DynamicData/List/Internal/Sort.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public IObservable<IChangeSet<T>> Run()
4545
var original = new List<T>();
4646
var target = new ChangeAwareList<T>();
4747

48-
var changed = _source.Synchronize(locker).Select(
48+
var dataChanged = _source.Synchronize(locker).Select(
4949
changes =>
5050
{
5151
if (_resetThreshold > 1)
@@ -58,7 +58,7 @@ public IObservable<IChangeSet<T>> Run()
5858
var resort = _resort.Synchronize(locker).Select(_ => Reorder(target));
5959
var changeComparer = _comparerObservable.Synchronize(locker).Select(comparer => ChangeComparer(target, comparer));
6060

61-
return changed.Merge(resort).Merge(changeComparer).Where(changes => changes.Count != 0).SubscribeSafe(observer);
61+
return changeComparer.Merge(resort).Merge(dataChanged).Where(changes => changes.Count != 0).SubscribeSafe(observer);
6262
});
6363
}
6464

0 commit comments

Comments
 (0)