[英]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.