如何使用 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)
作为内循环。
这应该有效:
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!
如果我有一个序列 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)
作为内循环。
这应该有效:
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!