Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何回到列表的开头?_C#_Linq - Fatal编程技术网

C# 如何回到列表的开头?

C# 如何回到列表的开头?,c#,linq,C#,Linq,我尝试使用Skip和Take方法从列表中获取值。但当列表结束时,我无法回到列表的开头 列表=新列表; 清单1; 清单2; 清单3; 清单4; 清单5; var list2=list.Skip4.Take3; 清单2中的foreachvar a{ 控制台。WriteLinea; } 结果是: 鸭子5 我想要的结果是: 鸭子5 鸭子1 鸭子2 您可以编写一个方法来生成IEnumerable循环,然后使用它 public static IEnumerable<T> ToCircular&l

我尝试使用Skip和Take方法从列表中获取值。但当列表结束时,我无法回到列表的开头

列表=新列表; 清单1; 清单2; 清单3; 清单4; 清单5; var list2=list.Skip4.Take3; 清单2中的foreachvar a{ 控制台。WriteLinea; } 结果是:

鸭子5 我想要的结果是:

鸭子5 鸭子1 鸭子2
您可以编写一个方法来生成IEnumerable循环,然后使用它

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);

否则我建议。只是要知道,你需要对无限的IEnumerables非常小心。许多需要使用整个集合的LINQ操作(例如,.ToList、.Reverse、.OrderBy)将冻结应用程序并导致其内存不足。

这里也可以使用Last和First。Console.WriteLinelist.First;Console.WriteLinelist.Last;您可以实现一个循环列表集合。NET没有内置枚举器,该枚举器在返回尾部后返回头部。@Igor如果我将Take更改为3,这将不起作用……我没有说任何关于Take的内容。您最初编写了想要Duck5和Duck1,这就完成了该请求。我不知道您为什么调用IEnumerable索引。我担心的是,您对代码中发生的事情有误解。你不能用列表上的标准LINQ做你想做的事。是的,我需要不止一次地循环,不管怎样,为了努力