[英]Get an enumerable of all sub lists of an existing list
我有一個List<T>
,我想獲得所有可能的子列表,例如:
[A, B, C, D, E] => [[A], [A, B], [A, B, C], [A, B, C, D], [A, B, C, D, E]]
有沒有一種簡單的方法可以使用LINQ to Objects獲取這個新的可枚舉?
編輯1:請注意,我只需要“前綴列表”,而不是所有可能的排列(即,顯示的示例結果已經完成)。
編輯2:請注意,我也想維護元素的順序。
編輯3:有沒有辦法獲得O(n)中的枚舉而不是O(n²),即通過僅在源上迭代一次而不是多次並在數據上返回某種視圖而不是新的列表每一次?
一種非常天真的擴展方法:
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> GetOrderedSubEnumerables<T>(
this IEnumerable<T> collection)
{
var builder = new List<T>();
foreach (var element in collection)
{
builder.Add(element);
yield return builder;
}
}
}
使用:
void Main()
{
var list = new List<string> { "A", "B", "C", "D", "E" };
Console.WriteLine(list.GetOrderedSubEnumerables());
}
結果:
請注意,在迭代集合時,這將返回數據的視圖。 但最終,如果您需要單獨使用每個排列,則需要先復制每個List<T>
,然后再將其返回。 在這種情況下,這應該這樣做:
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> GetOrderedSubEnumerables<T>(
this IEnumerable<T> collection)
{
var builder = new List<T>();
foreach (var element in collection)
{
builder.Add(element);
var local = new List<T>(builder);
yield return local;
}
}
}
是的,你是對的,你的要求是排列的一小部分,與排列無關。 所以這里我的建議是:
var result = Enumerable.Range(1, list.Count).
Select(i => list.Take(i).ToList()).
ToList();
您可以迭代列表中一定數量的項目,並選擇子列表,如下所示:
var list = new List<string> { "A", "B", "C", "D", "E"};
var query =
from i in Enumerable.Range(1, list.Count)
select list.Take(i);
請記住,如果您的數據不在List<T>
Count
可能很昂貴。 另請注意,這會不止一次地迭代您的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.