用它的一次出现替换序列中特定数字的连续出现

我无法解决这个特定问题。鉴于序列:


1  1  2  2  3  3  4  1  1  5  6  7  1  1

我希望连续出现的 1 被一次出现的 1 替换。


1  2  2  3  3  4  1  5  6  7  1

我尝试使用DistinctUntilChanged但这没有用。


List<int> intList = new List<int>() { 1, 1, 2, 2, 3, 3, 4, 1, 1, 5, 6, 7, 1, 1 };

            IObservable<int> intObsrvr = intList.ToObservable();

            intObsrvr

                .DistinctUntilChanged(x => x == 1)

                .SubscribeConsole();

我得到的输出是:


1,2,1,5,1

我也很好奇这个 keySelector 是如何工作的,因为我无法解释我在这里得到的输出序列。


哆啦的时光机
浏览 158回答 3
3回答

一只名叫tom的猫

尝试这个:var intList = new List<int>() { 1, 1, 2, 2, 3, 3, 4, 1, 1, 5, 6, 7, 1, 1 };var intObsrvr = intList.ToObservable();var query =&nbsp; &nbsp; intObsrvr&nbsp; &nbsp; &nbsp; &nbsp; .Scan(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new { skip = false, value = int.MinValue },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (a, x) =>&nbsp; new { skip = (a.value == 1) && (x == 1) , value = x })&nbsp; &nbsp; &nbsp; &nbsp; .Where(x => !x.skip)&nbsp; &nbsp; &nbsp; &nbsp; .Select(x => x.value);我觉得.Scan被严重低估了。您还可以使用.Publish/ Zip/ SelectMany:var query =&nbsp; &nbsp; intObsrvr.Publish(&nbsp; &nbsp; &nbsp; &nbsp; xs => xs&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .StartWith(int.MinValue)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Zip(xs, (z, x) => z == 1 & x == 1 ? new int[] { } : new [] { x })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .SelectMany(x => x));随你挑。var query =&nbsp; &nbsp; intObsrvr.Publish(&nbsp; &nbsp; &nbsp; &nbsp; xs => xs&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .StartWith(int.MinValue)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Zip(xs, (z, x) => z == 1 & x == 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ? Observable.Empty<int>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Observable.Return(x))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .SelectMany(x => x));甚至更多的选择。

LEATH

另一个Zip没有的变体SelectMany:var observable = new List<int> { 1, 1, 2, 2, 3, 3, 4, 1, 1, 5, 6, 7, 1, 1 }&nbsp; &nbsp; .ToObservable();observable.StartWith(int.MinValue).Zip(observable, (previous, current) => (previous, current))&nbsp; &nbsp; .Where(t => t.current != 1 || t.current != t.previous)&nbsp; &nbsp; .Select(t => t.current);

跃然一笑

如果内置方法不符合您的要求,您始终可以创建自己的方法。DistinctUntilChanged满足您需求的A相当简单:public static IEnumerable<T> DistinctUntilChanged<T>(&nbsp; &nbsp; this IEnumerable<T> source)&nbsp;{&nbsp; &nbsp; using (var e = source.GetEnumerator())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (!e.MoveNext())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield break;&nbsp; &nbsp; &nbsp; &nbsp; yield return e.Current;&nbsp; &nbsp; &nbsp; &nbsp; var previous = e.Current;&nbsp; &nbsp; &nbsp; &nbsp; while (e.MoveNext())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!e.Current.Equals(previous))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield return e.Current;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; previous = e.Current;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP