Enumerable.Zip 超过 2 个集合?
Posted
技术标签:
【中文标题】Enumerable.Zip 超过 2 个集合?【英文标题】:Enumerable.Zip more than 2 collections? 【发布时间】:2016-04-10 20:21:52 【问题描述】: var productNameTags = document.DocumentNode.SelectNodes(textBox3.Text);
var priceTags = document.DocumentNode.SelectNodes(textBox2.Text);
var codeNameAndPrice = productNameTags.Zip(priceTags, (n, w) => new productNameTags = n, priceTags = w );
int counter = 1;
if (codeNameAndPrice != null)
foreach (var nw in codeNameAndPrice)
label1.Visible = true;
label1.Text += counter + ". " + nw.productNameTags.Innerhtml + " - " + nw.priceTags.InnerHtml + "\n";
我有这段代码,它查看 html 标签并从网站打印出产品名称和价格,然后使用 .Zip 像这样打印出来:
-
棒球 - 5.00 英镑
足球 - £10.00
玩具车 - £15.00
有没有一种简单的方法可以使用不同的方法将三个或更多变量添加到一起压缩?
例如
-
棒球 - £5.00 - 1123
足球 - £10.00 - 1124
玩具车 - £15.00 - 1125
提前致谢!
【问题讨论】:
您可以链接Zip
命令 - 1123、1124 和 1125 来自哪里?
Zip N IEnumerable<T>s together? Iterate over them simultaneously?的可能重复
@RegEdit 这两个问题的期望结果是不同的,所以我不确定它应该是重复的......另一方面,答案可以适应回答这个问题......所以保持我的口袋里的金锤而不是关闭。
【参考方案1】:
没有。
您可以链接 Zip 调用,或者您可以编写(或查找)扩展/帮助方法,类似于 Zip 并行遍历多个源以提供您正在寻找的功能。
在您的特定情况下,请考虑迭代一些父节点并选择相对于父节点的单个子节点(假设特定项目的所有节点都是单个“父”节点的子节点)。
【讨论】:
【参考方案2】:我认为你不能用 .Zip 轻松做到这一点(禁止多个级别的 zip?),但你可以动态地做到这一点:
var names = new[] "Baseball", "Football", "Toy Car" ;
var prices = new[] 5.0M, 10.0M, 15.0M ;
var ids = new[] 1123, 1124, 1125 ;
var products = names
.Select((name, index) => new Name = name, Price = prices[index], Id = ids[index] );
【讨论】:
关于使用索引合并(对于相同长度的序列)的能力的好点。请注意,索引建议适用于数组/列表,但对于 Xml/Html 节点列表,每次访问索引可能是 O(n) 而不是 O(1),从而使整体代码 O(n^2) 而不是O(n)。以上是关于Enumerable.Zip 超过 2 个集合?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 .NET Core 中 Enumerable.Zip() 的 2 参数重载但 .NET Standard 中没有? [关闭]
Linq 中 Enumerable.Zip 扩展方法有啥用?
如何在多个(超过 2 个)集合中仅强制一组字段为非 NULL?