반응형
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"};
반응형
'Nice programing' 카테고리의 다른 글
Angular 2에서 앱이 시작될 때 서비스를 실행하는 방법 (0) | 2020.12.03 |
---|---|
ConfigurationManager를 사용하여 System.ServiceModel 구성 섹션로드 (0) | 2020.12.03 |
IRB에서 스크립트를 어떻게 다시로드 할 수 있습니까? (0) | 2020.12.03 |
캘린더에 항목을 추가하기위한 링크를 생성하려면 어떻게합니까? (0) | 2020.12.03 |
Google지도에서 div를 플로팅하는 방법은 무엇입니까? (0) | 2020.12.03 |