我正在寻找实现1
和 =
的反应式对象。
就是这样,我想写:
IObservable<IReadOnlyList<T>>
答案 0 :(得分:2)
首先,您在问题中发布的代码无法编译。我已尽力解决了这个问题:
var list = new MyReactiveList<int>();
var item = new Subject<int>();
list.Subscribe(values => Console.WriteLine($"[{string.Join(", ", values)}]"));
list.Add(item);
item.OnNext(1); // Will print out [1]
现在,练习只是实现class MyReactiveList<T> : IObservable<IReadOnlyList<T>>, IList<IObservable<T>>
。这很简单,但是唯一的问题是将可变的List<IObservable<T>>
变成IObservable<IReadOnlyList<T>>
,这样当列表更改时,可观察对象会自动更新。
这里是:
public class MyReactiveList<T> : IObservable<IReadOnlyList<T>>, IList<IObservable<T>>
{
private List<IObservable<T>> _list = new List<IObservable<T>>();
private Subject<Unit> _update = new Subject<Unit>();
public IDisposable Subscribe(IObserver<IReadOnlyList<T>> observer) =>
_update
.Select(_ => _list.CombineLatest().Select(x => new ReadOnlyList<T>(x)))
.Switch()
.Subscribe(observer);
public IObservable<T> this[int index]
{
get => _list[index];
set
{
_list[index] = value;
_update.OnNext(Unit.Default);
}
}
public int Count => _list.Count;
public bool IsReadOnly => false;
public void Add(IObservable<T> item)
{
_list.Add(item);
_update.OnNext(Unit.Default);
}
public void Clear()
{
_list.Clear();
_update.OnNext(Unit.Default);
}
public bool Contains(IObservable<T> item) => _list.Contains(item);
public void CopyTo(IObservable<T>[] array, int arrayIndex)
{
_list.CopyTo(array, arrayIndex);
}
public IEnumerator<IObservable<T>> GetEnumerator() => _list.GetEnumerator();
public int IndexOf(IObservable<T> item) => _list.IndexOf(item);
public void Insert(int index, IObservable<T> item)
{
_list.Insert(index, item);
_update.OnNext(Unit.Default);
}
public bool Remove(IObservable<T> item)
{
var removed = _list.Remove(item);
_update.OnNext(Unit.Default);
return removed;
}
public void RemoveAt(int index)
{
_list.RemoveAt(index);
_update.OnNext(Unit.Default);
}
IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator();
}
public class ReadOnlyList<T> : IReadOnlyList<T>
{
public ReadOnlyList(IEnumerable<T> items) { _list.AddRange(items); }
private List<T> _list = new List<T>();
public T this[int index] => _list[index];
public int Count => _list.Count;
public IEnumerator<T> GetEnumerator() => _list.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator();
}
NB:实现自己的可观察对象不是一个好主意-容易将它们弄错并创建与并发不能很好地结合使用的代码。