簡體   English   中英

可觀察 <IEnumerable> 得到序列元素之間的差異

[英]Observable<IEnumerable> get differences between sequence elements

我有一個可觀察到的IEnumerables序列

1: [1,2,3,4]

2: [1,3,4]

3: [1,5,6]

等等..

我想嘗試從這里創建兩個observable:

  • 發出IEnumerable新增元素的一個:

1: [1,2,3,4]

2: []

3: [5, 6]

等等..

  • 發出IEnumerable新刪除元素的一個:

1: []

2: [2]

3: [3,4]

等等..

有沒有辦法使用System.Reactive執行此操作,而不必依賴於保持單獨的數據結構來比較更改?

如果你使用Observable.ZipEnumerable.Except ,它很容易將元素n與元素n-1進行比較。

public static class IObservableIEnumerableExtensions
{
    public static IObservable<IEnumerable<T>> GetAddedElements<T>(this IObservable<IEnumerable<T>> source)
    {
        return source.Zip(source.StartWith(Enumerable.Empty<T>()), (newer, older) => newer.Except(older));
    }

    public static IObservable<IEnumerable<T>> GetRemovedElements<T>(this IObservable<IEnumerable<T>> source)
    {
        return source.Zip(source.StartWith(Enumerable.Empty<T>()), (newer, older) => older.Except(newer));
    }
}

這里有一些轉輪代碼:

var source = new Subject<IEnumerable<int>>();

var addedElements = source.GetAddedElements();
var removedElements = source.GetRemovedElements();

addedElements.Dump();   //Using Linqpad
removedElements.Dump(); //Using Linqpad

source.OnNext(new int[] { 1, 2, 3, 4 });
source.OnNext(new int[] { 1, 3, 4 });
source.OnNext(new int[] { 1, 5, 6 });

如果您希望添加和刪除從序列的開頭累積,您需要記住以前的內容。

public static IObservable<IEnumerable<T>> CumulativeAdded<T>(this IObservable<IEnumerable<T>> src) {
    var memadd = new HashSet<T>();

    return src.Select(x => x.Where(n => memadd.Add(n)));
}

public static IObservable<IEnumerable<T>> CumulativeRemoved<T>(this IObservable<IEnumerable<T>> src) {
    var memdiff = new HashSet<T>();

    return src.Select(x => { foreach (var n in x) memdiff.Add(n); return memdiff.AsEnumerable().Except(x); });
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM