Как go вернуться к началу списка? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь использовать методы 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);
}

Результат:

  • Duck5

Результат, который я ищу:

  • Утка5
  • Утка1
  • Утка2

Ответы [ 2 ]

4 голосов
/ 28 апреля 2020

Если вы знаете, что вам понадобится только «l oop back» один раз, и вы можете просто использовать Concat:

var list2 = list.Concat(list).Skip(4).Take(3);

В противном случае я предлагаю ответ Джухарра . Просто знайте, что вам нужно быть очень осторожным с бесконечными IEnumerables. Многие операции LINQ, которые должны использовать всю коллекцию (например, .ToList(), .Reverse(), .OrderBy()), заморозят ваше приложение и приведут к его нехватке памяти.

4 голосов
/ 28 апреля 2020

Вы можете написать метод, который сделает круг 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);
}

Но будьте осторожны, так как это приводит к бесконечному l oop, и вы захотите ограничить его при использовании с Take или TakeWhile или First.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...