簡體   English   中英

如何將 go 返回到列表的開頭?

[英]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);
}

結果是:

  • 鴨子5

我正在尋找的結果是:

  • 鴨子5
  • 鴨1
  • 鴨2

您可以編寫一個方法,使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);
}

但要小心,因為這會導致無限循環,並且在將其與TakeTakeWhileFirst一起使用時,您需要限制它。

如果你知道你只需要“回環”一次,你可以簡單地使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM