Как выбрать значения в указанном диапазоне индекса из списка с помощью LINQ

StackOverflow https://stackoverflow.com/questions/1042087

  •  22-07-2019
  •  | 
  •  

Вопрос

Я новичок LINQ, пытаюсь использовать его для достижения следующих целей:

У меня есть список целых: -

List<int> intList = new List<int>(new int[]{1,2,3,3,2,1});

Теперь я хочу сравнить сумму первых трех элементов [диапазон индекса 0-2] с последними тремя [диапазон индекса 3-5], используя LINQ. Я попробовал методы расширения LINQ Select и Take, а также метод SelectMany, но я не могу понять, как сказать что-то вроде

(from p in intList  
where p in  Take contiguous elements of intList from index x to x+n  
select p).sum()

Я тоже посмотрел на метод расширения Contains, но он не видит того, что я хочу. Какие-либо предложения? Спасибо.

Это было полезно?

Решение

Используйте Пропустить , а затем взять.

yourEnumerable.Skip(4).Take(3).Select( x=>x )

(from p in intList.Skip(x).Take(n) select p).sum()

Другие советы

Вы можете использовать GetRange ()

list.GetRange(index, count);

Для больших списков отдельный метод расширения может быть более подходящим для производительности. Я знаю, что это не обязательно для начального случая, но реализация Linq (для объектов) опирается на итерацию списка, поэтому для больших списков это может (бессмысленно) дорого. Простой метод расширения для достижения этой цели может быть следующим:

public static IEnumerable<TSource> IndexRange<TSource>(
    this IList<TSource> source,
    int fromIndex, 
    int toIndex)
{
    int currIndex = fromIndex;
    while (currIndex <= toIndex)
    {
        yield return source[currIndex];
        currIndex++;
    }
}

Для фильтрации по определенным индексам (не от-до):

public static class ListExtensions
{
   public static IEnumerable<TSource> ByIndexes<TSource>(this IList<TSource> source, params int[] indexes)
   {        
        if (indexes == null || indexes.Length == 0)
        {
            foreach (var item in source)
            {
                yield return item;
            }
        }
        else
        {
            foreach (var i in indexes)
            {
                if (i >= 0 && i < source.Count)
                    yield return source[i];
            }
        }
   }
}

Например:

string[] list = {"a1", "b2", "c3", "d4", "e5", "f6", "g7", "h8", "i9"};
var filtered = list.ByIndexes(5, 8, 100, 3, 2); // = {"f6", "i9", "d4", "c3"};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top