- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个问题是基于类似标题的问题 here ,有两个区别:
我的测试代码如下。我需要以下行为:
CoordMetrics
和一个 CoordData
,就会发布一个 CoordBundle
。我必须做什么才能完成这个?
public class CoordMetrics
{
internal CoordMetrics(int x, int y, IEnumerable<IMetric> metrics)
{
X = x;
Y = y;
Metrics = metrics;
}
internal int X { get; private set; }
internal int Y { get; private set; }
internal IEnumerable<IMetric> Metrics { get; private set; }
}
public class CoordData
{
internal CoordData(int x, int y, IEnumerable<IDatum> data)
{
X = x;
Y = y;
Data = data;
}
internal int X { get; private set; }
internal int Y { get; private set; }
internal IEnumerable<IDatum> Data { get; private set; }
}
public class CoordBundle
{
internal CoordBundle(int x, int y, IEnumerable<IMetric> metrics, IEnumerable<IDatum> data)
{
X = x;
Y = y;
Metrics = metrics;
Data = data;
}
internal int X { get; private set; }
internal int Y { get; private set; }
internal IEnumerable<IMetric> Metrics { get; private set; }
internal IEnumerable<IDatum> Data { get; private set; }
}
[TestClass]
public class PairingTest
{
[TestMethod, TestCategory("Temp")]
public void PairedObservableTest()
{
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
var aSource = new Subject<CoordMetrics>();
var bSource = new Subject<CoordData>();
var paired = Observable.Merge(aSource.Select(a => new Pair(a, null)), bSource.Select(b => new Pair(null, b)))
.GroupBy(p => p.Item1 != null ? new { p.Item1.X, p.Item1.Y } : new { p.Item2.X, p.Item2.Y })
.SelectMany(g => g.Buffer(2).Take(1))
.Select(g => new Pair(
g.ElementAt(0).Item1 ?? g.ElementAt(1).Item1,
g.ElementAt(0).Item2 ?? g.ElementAt(1).Item2))
.Select(t => new CoordBundle(t.Item1.X, t.Item1.Y, t.Item1.Metrics, t.Item2.Data));
paired.Subscribe(g => Trace.WriteLine(String.Format("{0},{1}", g.X, g.Y)));
bSource.OnNext(new CoordData(2, 1, Enumerable.Empty<IDatum>()));
aSource.OnNext(new CoordMetrics(2, 2, Enumerable.Empty<IMetric>()));
aSource.OnNext(new CoordMetrics(1, 1, Enumerable.Empty<IMetric>()));
bSource.OnNext(new CoordData(1, 2, Enumerable.Empty<IDatum>()));
bSource.OnNext(new CoordData(2, 2, Enumerable.Empty<IDatum>()));
bSource.OnNext(new CoordData(1, 1, Enumerable.Empty<IDatum>()));
aSource.OnNext(new CoordMetrics(1, 2, Enumerable.Empty<IMetric>()));
aSource.OnNext(new CoordMetrics(2, 1, Enumerable.Empty<IMetric>()));
aSource.OnNext(new CoordMetrics(2, 2, Enumerable.Empty<IMetric>()));
bSource.OnNext(new CoordData(2,2,Enumerable.Empty<IDatum>()));
}
}
期望的输出——上面的代码只输出前 4 行:
2,2
1,1
1,2
2,1
2,2
2,2
最佳答案
我想我有你想要的。公平地说,这不是一个简单的问题。一个序列是另一个序列的种子是很常见的,但这里的复杂情况是任何一个序列都可以是另一个序列的种子。
为了获得可行的解决方案,我做的第一件事就是将其分解为可验证的单元测试。我建议使用 TestScheduler
及其相关类型来执行此操作(而不是主题等)。
我根据我认为您的要求创建了弹珠图。然后我可以将其映射到两个测试输入序列和预期的输出序列。
最后一部分是实际创建查询。
我最终采用的方法* 是创建两个序列,这两个序列将尝试匹配主序列和子序列 -> SelectMany
+ Where
。然而,由于两个输入都可以扮演主序列的角色,所以我需要这样做两次。因为我会订阅两次,所以我需要共享序列 -> Publish()
。此外,由于每个序列都可能产生多个值,因此我需要在重复项到达时取消之前匹配项的匹配项 -> TakeUntil
。最后,我将两个结果集合并在一起 -> Merge
。
*我考虑过 GroupJoin
和 CombineLatest
但它们似乎对我不起作用。
[TestClass]
public class PairingTest
{
[TestMethod, TestCategory("Temp")]
public void PairedObservableTest()
{
var scheduer = new TestScheduler();
/*
Legend
a = aSource (CoordMetrics)
b = bSource (CoordData)
r = expected result
a ----2--1-----------1--2--2-----
2 1 2 1 2
b -2--------1--2--1-----------2--
1 2 2 1 2
r -------------2--1--1--2--2--2--
2 1 2 1 2 2
*/
var aSource = scheduer.CreateColdObservable<CoordMetrics>(
ReactiveTest.OnNext(5, new CoordMetrics(2, 2)),
ReactiveTest.OnNext(8, new CoordMetrics(1, 1)),
ReactiveTest.OnNext(20, new CoordMetrics(1, 2)),
ReactiveTest.OnNext(23, new CoordMetrics(2, 1)),
ReactiveTest.OnNext(26, new CoordMetrics(2, 2))
);
var bSource = scheduer.CreateColdObservable<CoordData>(
ReactiveTest.OnNext(2, new CoordData(2, 1)),
ReactiveTest.OnNext(11, new CoordData(1, 2)),
ReactiveTest.OnNext(14, new CoordData(2, 2)),
ReactiveTest.OnNext(17, new CoordData(1, 1)),
ReactiveTest.OnNext(29, new CoordData(2, 2))
);
var testObserver = scheduer.CreateObserver<string>();
Implementation(aSource, bSource)
.Subscribe(testObserver);
scheduer.Start();
ReactiveAssert.AreElementsEqual(
new[] {
ReactiveTest.OnNext(14, "2,2"),
ReactiveTest.OnNext(17, "1,1"),
ReactiveTest.OnNext(20, "1,2"),
ReactiveTest.OnNext(23, "2,1"),
ReactiveTest.OnNext(26, "2,2"),
ReactiveTest.OnNext(29, "2,2")
},
testObserver.Messages
);
}
private static IObservable<string> Implementation(IObservable<CoordMetrics> aSource, IObservable<CoordData> bSource)
{
return Observable.Create<string>(observer =>
{
var aShared = aSource.Publish();
var bShared = bSource.Publish();
var fromA = aShared.SelectMany(a => bShared
//Find matching values from B's
.Where(b => a.X == b.X && a.Y == b.Y)
//Only run until another matching A is produced
.TakeUntil(aShared.Where(a2 => a2.X == a.X && a2.Y == a.Y))
//Project/Map to required type.
.Select(b => new CoordBundle(a.X, a.Y /*, a.Metrics, b.Data*/ ))
);
var fromB = bShared.SelectMany(b => aShared
//Find matching values from A's
.Where(a => a.X == b.X && a.Y == b.Y)
//Only run until another matching B is produced
.TakeUntil(bShared.Where(b2 => b2.X == b.X && b2.Y == b.Y))
//Project/Map to required type.
.Select(a => new CoordBundle(a.X, a.Y /*, a.Metrics, b.Data*/ ))
);
var paired = Observable.Merge(fromA, fromB);
paired
.Select(g => String.Format("{0},{1}", g.X, g.Y))
.Subscribe(observer);
return new CompositeDisposable(aShared.Connect(), bShared.Connect());
});
}
}
// Define other methods and classes here
public class CoordMetrics
{
internal CoordMetrics(int x, int y)
{
X = x;
Y = y;
}
internal int X { get; private set; }
internal int Y { get; private set; }
}
public class CoordData
{
internal CoordData(int x, int y)
{
X = x;
Y = y;
}
internal int X { get; private set; }
internal int Y { get; private set; }
}
public class CoordBundle
{
internal CoordBundle(int x, int y)
{
X = x;
Y = y;
}
internal int X { get; private set; }
internal int Y { get; private set; }
}
public class Pair
{
public Pair(CoordMetrics x, CoordData y)
{
Item1 = x;
Item2 = y;
}
public CoordMetrics Item1 { get; set; }
public CoordData Item2 { get; set; }
}
关于c# - 我可以通过匹配键将两个可观察序列配对——使用重复键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37264175/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!