c# - 将序列中连续出现的特定数字替换为单个出现
问题描述
我无法解决这个特殊问题。给定顺序:
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 是如何工作的,因为我无法解释我在这里得到的输出序列。
解决方案
尝试这个:
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 =
intObsrvr
.Scan(
new { skip = false, value = int.MinValue },
(a, x) => new { skip = (a.value == 1) && (x == 1) , value = x })
.Where(x => !x.skip)
.Select(x => x.value);
我觉得这.Scan
是非常被低估的。
您也可以使用.Publish
// Zip
:SelectMany
var query =
intObsrvr.Publish(
xs => xs
.StartWith(int.MinValue)
.Zip(xs, (z, x) => z == 1 & x == 1 ? new int[] { } : new [] { x })
.SelectMany(x => x));
任你选。
var query =
intObsrvr.Publish(
xs => xs
.StartWith(int.MinValue)
.Zip(xs, (z, x) => z == 1 & x == 1
? Observable.Empty<int>()
: Observable.Return(x))
.SelectMany(x => x));
更多选择。
推荐阅读
- azure - 我们可以使用 ARM 模板从 Azure Kubernetes 服务配置 kube-router 网络策略吗
- swift - 为什么 UItableview 中单元格的宽度与模拟器中的屏幕宽度不同?
- swift - 铸造任何?转换为 Int、String 或 Bool
- php - 在 wordpress 中编辑 wp-admin
- linux - 如何让 ASAN 忽略子进程?
- google-app-engine - 用户代码沙箱使用谷歌云功能和 puppeteer 安全吗?
- object-detection - 对象检测 MASK RCNN 仅适用于 2 个类
- c - 忽略返回值(C 编程)
- android - 我无法在 Recyclerview 项目中打开片段
- c# - 如何在 VB.NET 的文本框中显示文件浏览器对话框路径目录