-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
106 lines (88 loc) · 3.08 KB
/
Copy pathProgram.cs
File metadata and controls
106 lines (88 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using DynamicData;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Reactive.Linq;
namespace ComparerStreamIssue;
public sealed class Program
{
private static readonly SourceCache<TestUserItem, string>
_sourceCache = new(x => x.Id);
public static void Main()
{
int limit = 10;
for (int i = 1; i <= limit; i++)
{
_sourceCache.AddOrUpdate(new TestUserItem(
$"{i}",
((limit - i) * 10).ToString(),
new string((char)('a' + (i % 13)), 7)));
}
_ = GetTestUserItemSourceChangeSetStream()
.Bind(out ReadOnlyObservableCollection<TestUserItem> _testUserItems)
.Subscribe(_ =>
{
Console.WriteLine("-= List =-");
foreach (TestUserItem testUserItem in _testUserItems)
{
Console.WriteLine($"{testUserItem.Number} - {testUserItem.Name}");
}
Console.WriteLine("-----------------");
});
_ = Console.ReadKey();
}
private static IObservable<IChangeSet<TestUserItem, string, VirtualContext<TestUserItem>>> GetTestUserItemSourceChangeSetStream()
{
return _sourceCache
.Connect()
.SortAndVirtualize(
GetComparerStream(),
Observable.Return(new VirtualRequest(0, 20_000)),
new SortAndVirtualizeOptions
{
InitialCapacity = 100,
ResetThreshold = 100,
UseBinarySearch = true
});
}
private static IObservable<IComparer<TestUserItem>> GetComparerStream()
{
return Observable
.Timer(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(5))
.Select(timer => timer % 2 == 0
? TestUserNameComparer.Instance
: TestUserNumberComparer.Instance)
.Do(comparer => Debug.WriteLine($">>> ComparerStream emitted: {comparer}"))
.Replay(1)
.RefCount();
}
public class TestUserItem(string Id, string Number, string Name)
{
public string Id { get; } = Id;
public string Number { get; } = Number;
public string Name { get; } = Name;
}
public class TestUserNameComparer : IComparer<TestUserItem>
{
public static readonly IComparer<TestUserItem> Instance = new TestUserNameComparer();
public int Compare(TestUserItem? x, TestUserItem? y)
{
return x!.Name.CompareTo(y!.Name);
}
public override string ToString()
{
return "TestUserNameComparer";
}
}
public class TestUserNumberComparer : IComparer<TestUserItem>
{
public static readonly IComparer<TestUserItem> Instance = new TestUserNumberComparer();
public int Compare(TestUserItem? x, TestUserItem? y)
{
return x!.Number.CompareTo(y!.Number);
}
public override string ToString()
{
return "TestUserNumberComparer";
}
}
}