我可以使用Linq从IEnumerables构建元组吗?

时间:2011-11-29 13:42:44

标签: c# linq tuples

我有两个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覆盖了这个代码,我宁愿不重新发明轮子。

2 个答案:

答案 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);
            });
    }