[英]How to go back to the start of a list?
我正在嘗試使用方法Skip()
和Take()
從列表中獲取值。 但是當列表結束時,我無法將 go 回到列表的開頭。
List<string> list = new List<string>();
list.Add("Duck1");
list.Add("Duck2");
list.Add("Duck3");
list.Add("Duck4");
list.Add("Duck5");
var list2 = list.Skip(4).Take(3);
foreach(var a in list2) {
Console.WriteLine(a);
}
結果是:
我正在尋找的結果是:
您可以編寫一個方法,使IEnumerable<T>
循環,然后使用它。
public static IEnumerable<T> ToCircular<T>(this IEnumerable<T> source)
{
while(true)
{
foreach(var x in source) yield return x;
}
}
然后您可以執行以下操作
List<string> list = new List<string>();
list.Add("Duck1");
list.Add("Duck2");
list.Add("Duck3");
list.Add("Duck4");
list.Add("Duck5");
var list2 = list.ToCircular().Skip(4).Take(3);
foreach(var a in list2){
Console.WriteLine(a);
}
但要小心,因為這會導致無限循環,並且在將其與Take
或TakeWhile
或First
一起使用時,您需要限制它。
如果你知道你只需要“回環”一次,你可以簡單地使用 Concat:
var list2 = list.Concat(list).Skip(4).Take(3);
否則我建議juharr's answer 。 請注意,您需要非常小心使用無限的 IEnumerables。 許多需要消耗整個集合的 LINQ 操作(例如.ToList()
、 .Reverse( .Reverse()
、 .OrderBy()
)將凍結您的應用程序並導致它用完 memory。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.