如何使用 LINQ 将泛型序列转换为三角形?

How to convert generic sequence into triangle using LINQ?

如果我有一个序列 IEnumerable<T>(不是数字,只是 T):

[ a, b, c, d ]

如何return 排序帕斯卡或弗洛伊德的三角形:

a
ab
abc
abcd

所以会是 IEnumerable<IEnumerable<T>>?

想知道是否有一种方法可以使用 LINQ 优雅地实现这一点,而不是使用循环手动实现。

使用 Enumerable.Range 代替 for 循环让你用一行代码构建一个三角形:

var data = new string[] {"a", "b", "c", "d"};
var triangle = Enumerable.Range(1, data.Length).Select(row => data.Take(row));

Enumerable.Range作为外循环; data.Take(row) 作为内循环。

Demo.

这应该有效:

var seq = new List<string> { "a", "b", "c", "d" };
var pascal = seq.Select(a => seq.Take(seq.IndexOf(a) +1 ).ToList());

编辑:

var seq = new List<string> { "a", "b", "c", "d" };
var pascal = seq.Select((a,i) => seq.Take(i+1).ToList());

这是一个方法:

T[][] ToTriangle<T>(IEnumerable<T> input)
{
    var inputAsList = input as List<T> ?? input.ToList();
    return inputAsList.Select((t, i) => inputAsList.Take(i + 1).ToArray()).ToArray();
}

来自控制台应用程序:

static void Main(string[] args)
{
    var input = "Hello, world!";
    var output = ToTriangle(input);
    foreach (var set in output)
    {
        Console.WriteLine(string.Join("",set));
    }
    Console.ReadLine();
}

(字符串是字符数组。)

H
He
Hel
Hell
Hello
Hello,
Hello,
Hello, w
Hello, wo
Hello, wor
Hello, worl
Hello, world
Hello, world!