我有两个IEnumerable<double>
,我想从IEnumerable
建立一个Tuple<int, double, double>
。 Item1
的{{1}}应该是项目的索引,Tuple
是第一个集合中索引位置的值,Item2
是索引位置的值在第二个集合中。这是否可以在Linq中轻松完成?
E.g。
Item3
其中:
var first = new List<double>() { 10.0, 20.0, 30.0 };
var second = new List<double>() { 1.0, 2.0, 3.0 };
var result = TupleBuild(first, second);
// result = {(0, 10.0, 1.0), (1, 20.0, 2.0), (2, 30.0, 3.0)}
我意识到我可以为此编写一些手写代码,但如果Linq覆盖了这个代码,我宁愿不重新发明轮子。
答案 0 :(得分:22)
使用Zip
运算符和提供元素索引的Select
重载如何:
return first.Zip(second, Tuple.Create)
.Select((twoTuple, index)
=> Tuple.Create(index, twoTuple.Item1, twoTuple.Item2));
顺便说一下,您可以将方法设为通用:
IEnumerable<Tuple<int, TFirst, TSecond>> TupleBuild<TFirst, TSecond>
(IEnumerable<TFirst> first, IEnumerable<TSecond> second) { ... }
答案 1 :(得分:1)
每个 C# 7.0
更新的更现代版本(基于@Ani 的回答)。
这使用了更易读的 (IMO) 元组语法,没有 Tuple.Create
。还要注意 Select
方法中的返回类型和 元组解构。
IEnumerable<(int, double, double)> TupleBuild
(IEnumerable<double> first, IEnumerable<double> second)
{
return first
.Zip(second)
.Select((tuple, index) =>
{
var (fst, snd) = tuple;
return (index, fst, snd);
});
}