如果我有一個序列IEnumerable<T>
(不是數字,只是T
):如何使用LINQ將通用序列轉換爲三角形?
[ a, b, c, d ]
如何返回排序帕斯卡或Floyd的三角:
a
ab
abc
abcd
所以這將是IEnumerable<IEnumerable<T>>
?
想知道是否有一種方法來實現這一點,使用LINQ而不是手動使用循環實現。
如果我有一個序列IEnumerable<T>
(不是數字,只是T
):如何使用LINQ將通用序列轉換爲三角形?
[ a, b, c, d ]
如何返回排序帕斯卡或Floyd的三角:
a
ab
abc
abcd
所以這將是IEnumerable<IEnumerable<T>>
?
想知道是否有一種方法來實現這一點,使用LINQ而不是手動使用循環實現。
這應該工作:
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());
代替for
環的使用Enumerable.Range
讓你建立與一個單一的代碼線的三角形:
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)
作爲內部循環。
問正確的問題是解決方案的一半:)我得到了同樣的結果,但爲了避免雙重序列枚舉必須要求'IReadOnlyCollection
假設長度= 4的任意序列,我不認爲它是一個有效的帕斯卡或弗洛伊德的三角形。 – Romoku
@Romoku:我不是在尋找有效的帕斯卡爾或弗洛伊德的三角形,只是沒有找到更好的方式來解釋我在找什麼。基本上只是一個三角形。 – abatishchev
這裏有一個方法:
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();
}
(A字符串是字符數組。)
ħ
他
赫爾
地獄
你好
你好,
您好,
您好,瓦特
你好,我
你好,wor
你好,worl
你好,世界
你好,世界!
希望你不會介意給Etienne一些額外的分數,因爲他/她的解決方案比你初次發佈時略微早一些。 – abatishchev
這很可愛!你可能想提一個假設,序列的元素需要是唯一的。 – dasblinkenlight
'Select((x,i)=> ...)'會以更有效的方式來做同樣的技巧嗎? – abatishchev
是的,你是對的。 – Etienne