Nice programing

LINQ를 사용하여 목록에서 제공된 인덱스 범위 내의 값을 선택하는 방법

nicepro 2020. 12. 3. 19:43
반응형

LINQ를 사용하여 목록에서 제공된 인덱스 범위 내의 값을 선택하는 방법


나는 다음을 달성하기 위해 그것을 사용하려는 LINQ 초보자입니다.

정수 목록이 있습니다.

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

이제 LINQ를 사용하여 처음 세 요소 [인덱스 범위 0-2]와 마지막 세 [인덱스 범위 3-5]의 합을 비교하고 싶습니다. 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()

포함 확장 메서드도 살펴 보았지만 원하는 것을 얻지 못했습니다. 어떤 제안? 감사.


Skip사용하고 Take를 사용합니다 .

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"};

참고 URL : https://stackoverflow.com/questions/1042087/how-to-select-values-within-a-provided-index-range-from-a-list-using-linq

반응형