Есть ли в C # функция linq, которая позволяет собирать IEnumerables из определенного диапазона индексов?

Примером будет

        var objectArray = new string[] { "Bill", "Bob", "Joe", "Phil", "Tom", "Paul" };
        var indexArray = new int[] { 1, 3, 5 };

        var list = objectArray.Where(SOME_FUNCTION_TO_GET_INDEXES ??).ToList();

        //output would be list:
        //Bob
        //Phil
        //Paul
0
Alex Hunt 24 Апр 2017 в 19:42

2 ответа

Лучший ответ

Просто используйте Select с вашим indexArray и верните элемент из objectArray с помощью индексации.

var list = indexArray.Select(i => objectArray[i]);

Обратите внимание, что это работает очень эффективно для любой коллекции, которая позволяет индексировать (например, Array и List<T>). В более общем случае наличия IEnumerable или ICollection вы не сможете индексировать напрямую. В этом случае вам нужно будет увидеть ответ Джона. В зависимости от размеров задействованных списков и количества предметов, которые вам нужно найти, может быть стоит преобразовать ваш IEnumerable в Array или List (используя ToArray например) первый.

9
Matt Burland 24 Апр 2017 в 17:04

Если исходный источник данных уже доступен по индексу, например по списку или массиву, вы можете просто использовать indexArray.Select, как показал Мэтт.

Если вместо этого у вас есть IEnumerable<T>, вы можете использовать перегрузку Where, которая предоставляет индекс и значение. Так:

var list = objectArray.Where((value, index) => indexArray.Contains(index))
                      .ToList();
8
Jon Skeet 24 Апр 2017 в 17:01