- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
请帮我理解一个现象:
为什么 X 不等于 Observable 项中的索引?
例如构建 block :
public class EcgSample
{
public EcgSample(int y)
{
Y = y;
}
public int X { get; set; }
public int Y { get; set; }
}
private void Print(Tuple<EcgSample, int> s)
{
Debug.WriteLine("X : {0} , Y : {1} , Index : {2}", s.Item1.X, s.Item1.Y, s.Item2);
}
private List<EcgSample> CreateSamples()
{
var testSamples = new List<EcgSample>();
for (short i = 0; i < 1400; i++)
{
testSamples.Add(new EcgSample(i));
}
return testSamples;
}
可观察示例:(输出预期结果)
// (1) Create From Collection .
IObservable<EcgSample> sampleObservable = CreateSamples().ToObservable(new EventLoopScheduler());
// (2) Repeat
IObservable<EcgSample> repeated = sampleObservable.Repeat();
// (3) Indexed
IObservable<Tuple<EcgSample,int>> indexed = repeated.Select((item, index) =>
{
item.X = index;
return new Tuple<EcgSample, int>(item, index);
});
// (4) Buffered
IObservable<IList<Tuple<EcgSample, int>>> buffered = indexed.Buffer(250);
// (5) SelectMany and Print .
_disposable = buffered.SelectMany(buf => buf).Subscribe(Print);
OUTPUT:这是 Observable 序列的预期输出。
[8384] X : 0 , Y : 0 , Index : 0
[8384] X : 1 , Y : 1 , Index : 1
[8384] X : 2 , Y : 2 , Index : 2
[8384] X : 3 , Y : 3 , Index : 3
[8384] X : 4 , Y : 4 , Index : 4
修改:(不输出非预期结果)
现在我不想在每个时间间隔都使用每个缓冲区:
// (5) Create an Observable from a Timer.
IObservable<ElapsedEventArgs> timerObservable = Observable.Create<ElapsedEventArgs>(
observer =>
{
var timer = new Timer();
timer.Interval = 250;
timer.Elapsed += (s, e) => observer.OnNext(e);
timer.Start();
return Disposable.Create(() =>
{
timer.Stop();
});
});
// (6) Zip with the buffer observable
IObservable<IList<Tuple<EcgSample, int>>> zipped = timerObservable.Zip(buffered, (t, b) => b);
// (7) SelectMany and Print .
_disposable = zipped.SelectMany(buf => buf).Subscribe(Print);
输出:这输出了一个意想不到的结果:注意 X 不等于索引。
[9708] X : 187600 , Y : 0 , Index : 0
[9708] X : 187601 , Y : 1 , Index : 1
[9708] X : 187602 , Y : 2 , Index : 2
[9708] X : 187603 , Y : 3 , Index : 3
知道为什么 X 从 187600 开始(不用说每次我运行我的程序时这个值都不一样)..?
编辑:
我通过在最后简单地投影解决了这个问题,但我仍然想知道为什么会出现第一个问题。
List<EcgSample> list = CreateSamples();
var loop = new EventLoopScheduler();
var sampleObservable = list.ToObservable(loop);
IObservable<EcgSample> reapeted = sampleObservable.Repeat();
IObservable<IList<EcgSample>> buffered = reapeted.Buffer(250);
IObservable<ElapsedEventArgs> timerObservable = Observable.Create<ElapsedEventArgs>(
observer =>
{
var timer = new Timer();
timer.Interval = 250;
timer.Elapsed += (s, e) => observer.OnNext(e);
timer.Start();
return Disposable.Create(() =>
{
timer.Stop();
});
});
IObservable<IList<EcgSample>> zipped = timerObservable.Zip(buffered, (t, b) => b);
_disposable = zipped.SelectMany(buf => buf).Select((item, index) =>
{
item.X = index;
return new Tuple<EcgSample, int>(item, index);
}).Subscribe(Print);
最佳答案
您的答案显示了您可以更改的一件事以获得您想要的行为,但这并不是它没有按您预期的方式工作的真正原因。
如果你想将 Observable 中的每个条目与一个数字相关联,你实际上应该将它与一个数字相关联。你这样做的方式,流中的每个元素和数字之间没有实际的联系。您的修复只是确保您在下一个项目通过之前处理每个项目,因此该数字恰好处于正确的值。但这是一个非常不稳定的情况。
如果您只想知道您在直播中进行的项目的运行计数,请查看 the overload of Select that gives you the index :
stream.Select((item, index) => new { item, index })
.Subscribe(data => Debug.WriteLine("Item at index {0} is {1}", data.index, data.item))
或者,如果您想要的不仅仅是流中的项目计数,您可以这样做:
stream.Select(item => new { item, index = <some value you calculate> })
...
这样你的对象和它的索引就联系在一起了。您可以在未来的任何时候使用该项目的索引,并且仍然知道它的索引是什么。而您的代码依赖于在处理下一个项目之前获取每个项目。
解决问题中的修改
首先,看看Observable.Interval .它可以完成您尝试使用计时器执行的操作,但更容易。
其次,请看下面的示例,它再现了您在问题中所做的事情。运行此代码会产生正确的输出:
var items = Enumerable.Range(65, 26)
.Select(i => (char)i)
.Repeat();
var observableItems = items.ToObservable()
.Select((c, i) => new { Char = c, Index = i });
var interval = Observable.Interval(TimeSpan.FromSeconds(0.25));
var buffered = observableItems.Buffer(10);
var zipped = buffered.Zip(interval, (buffer, _) => buffer);
zipped.SelectMany(buffer => buffer).Dump();
您可以在 LinqPad 中运行该代码,这是探索 Rx(以及 .Net 的其他部分)的非常有用的工具。
最后 - 我假设这是一个简化的练习,试图找出您的情况。看起来您可能正在尝试处理推送比您想要处理的更多更新的传感器数据。将 Zip 与间隔一起使用不会有太大帮助。您会减慢数据到达的速度,但它只会建立越来越大的等待通过 Zip 的数据队列。
如果你想每250毫秒获取一个数据点,看Sample .如果您想一次获得 250 毫秒的读数,请查看 overload of Buffer that takes a timespan instead of a count .
关于c# - RX - Zip 输出意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29755137/
我正在使用 OUTFILE 命令,但由于权限问题和安全风险,我想将 shell 的输出转储到文件中,但出现了一些错误。我试过的 #This is a simple shell to connect t
我刚刚开始学习 Java,我想克服在尝试为这个“问题”创建 Java 程序时出现的障碍。这是我必须创建一个程序来解决的问题: Tandy 喜欢分发糖果,但只有 n 颗糖果。对于她给第 i 个糖果的人,
你好,我想知道我是否可以得到一些帮助来解决我在 C++ 中打印出 vector 内容的问题 我试图以特定顺序在一个或两个函数调用中输出一个类的所有变量。但是我在遍历 vector 时收到一个奇怪的错误
我正在将 intellij (2019.1.1) 用于 java gradle (5.4.1) 项目,并使用 lombok (1.18.6) 来自动生成代码。 Intellij 将生成的源放在 out
编辑:在与 guest271314 交流后,我意识到问题的措辞(在我的问题正文中)可能具有误导性。我保留了旧版本并更好地改写了新版本 背景: 从远程服务器获取 JSON 时,响应 header 包含一
我的问题可能有点令人困惑。我遇到的问题是我正在使用来自 Java 的 StoredProcedureCall 调用过程,例如: StoredProcedureCall call = new Store
在我使用的一些IDL中,我注意到在方法中标记返回值有2个约定-[in, out]和[out, retval]。 当存在多个返回值时,似乎使用了[in, out],例如: HRESULT MyMetho
当我查看 gar -h 的帮助输出时,它告诉我: [...] gar: supported targets: elf64-x86-64 elf32-i386 a.out-i386-linux [...
我想循环遍历一个列表,并以 HTML 格式打印其中的一部分,以代码格式打印其中的一部分。所以更准确地说:我想产生与这相同的输出 1 is a great number 2 is a great
我有下面的tekton管道,并尝试在Google Cloud上运行。集群角色绑定。集群角色。该服务帐户具有以下权限。。例外。不确定需要为服务帐户设置什么权限。
当尝试从 make 过滤非常长的输出以获取特定警告或错误消息时,第一个想法是这样的: $ make | grep -i 'warning: someone set up us the bomb' 然而
我正在创建一个抽象工具类,该类对另一组外部类(不受我控制)进行操作。外部类在某些接口(interface)点概念上相似,但访问它们相似属性的语法不同。它们还具有不同的语法来应用工具操作的结果。我创建了
这个问题已经有答案了: What do numbers starting with 0 mean in python? (9 个回答) 已关闭 7 年前。 在我的代码中使用按位与运算符 (&) 时,我
我写了这段代码来解析输入文件中的行输入格式:电影 ID 可以有多个条目,所以我们应该计算平均值输出:**没有重复(这是问题所在) import re f = open("ratings2.txt",
我需要处理超过 1000 万个光谱数据集。数据结构如下:大约有 1000 个 .fits(.fits 是某种数据存储格式)文件,每个文件包含大约 600-1000 个光谱,其中每个光谱中有大约 450
我编写了一个简单的 C 程序,它读取一个文件并生成一个包含每个单词及其出现频率的表格。 该程序有效,我已经能够在 Linux 上运行的终端中获得显示的输出,但是,我不确定如何获得生成的显示以生成包含词
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
1.普通的输出: print(str)#str是任意一个字符串,数字··· 2.格式化输出: ?
我无法让 logstash 正常工作。 Basic logstash Example作品。但后来我与 Advanced Pipeline Example 作斗争.也许这也可能是 Elasticsear
这是我想要做的: 我想让用户给我的程序一些声音数据(通过麦克风输入),然后保持 250 毫秒,然后通过扬声器输出。 我已经使用 Java Sound API 做到了这一点。问题是它有点慢。从发出声音到
我是一名优秀的程序员,十分优秀!