.NET 3.5를 사용 n하고 있으며 목록에서 * * 번째 항목을 모두 얻을 수 있기를 원합니다 . 람다 식을 사용했는지 LINQ를 사용했는지에 대해서는 신경 쓰지 않습니다.
편집하다
이 질문이 꽤 많은 논쟁을 불러 일으켰던 것 같습니다 (좋은 일 이죠?). 내가 배운 가장 중요한 것은 무언가를하는 모든 방법을 알고 있다고 생각할 때 (이것처럼 간단하더라도) 다시 생각한다는 것입니다!
.NET 3.5를 사용 n하고 있으며 목록에서 * * 번째 항목을 모두 얻을 수 있기를 원합니다 . 람다 식을 사용했는지 LINQ를 사용했는지에 대해서는 신경 쓰지 않습니다.
편집하다
이 질문이 꽤 많은 논쟁을 불러 일으켰던 것 같습니다 (좋은 일 이죠?). 내가 배운 가장 중요한 것은 무언가를하는 모든 방법을 알고 있다고 생각할 때 (이것처럼 간단하더라도) 다시 생각한다는 것입니다!
답변:
return list.Where((x, i) => i % nStep == 0);
나는 그것이 "오래된 학교"라는 것을 알고 있지만, 왜 stepping = n과 함께 for 루프를 사용하지 않는가?
처럼 들린다
IEnumerator<T> GetNth<T>(List<T> list, int n) {
for (int i=0; i<list.Count; i+=n)
yield return list[i]
}
트릭을 할 것입니다. Linq 또는 람다 식을 사용할 필요가 없다고 생각합니다.
편집하다:
그것을 만드십시오
public static class MyListExtensions {
public static IEnumerable<T> GetNth<T>(this List<T> list, int n) {
for (int i=0; i<list.Count; i+=n)
yield return list[i];
}
}
LINQish 방식으로 작성합니다.
from var element in MyList.GetNth(10) select element;
2 차 편집 :
더 LINQish로 만들기 위해
from var i in Range(0, ((myList.Length-1)/n)+1) select list[n*i];
list[i]대신 반환하는 이유는 list[n-1]무엇입니까?
요소와 함께 인덱스를 전달하는 Where 오버로드를 사용할 수 있습니다.
var everyFourth = list.Where((x,i) => i % 4 == 0);
For 루프
for(int i = 0; i < list.Count; i += n)
//Nth Item..
List<T>했으므로 Count저렴하다고 정의됩니다.
linq 확장을 제공하면 최소한의 특정 인터페이스, 따라서 IEnumerable에서 작업 할 수 있어야한다고 생각합니다. 물론, 특히 큰 N에 대해 속도를 내고 있다면 인덱스 액세스에 과부하를 제공 할 수 있습니다. 후자는 필요하지 않은 많은 양의 데이터를 반복 할 필요가 없으며 Where 절보다 훨씬 빠릅니다. 두 오버로드를 모두 제공하면 컴파일러가 가장 적합한 변형을 선택할 수 있습니다.
public static class LinqExtensions
{
public static IEnumerable<T> GetNth<T>(this IEnumerable<T> list, int n)
{
if (n < 0)
throw new ArgumentOutOfRangeException("n");
if (n > 0)
{
int c = 0;
foreach (var e in list)
{
if (c % n == 0)
yield return e;
c++;
}
}
}
public static IEnumerable<T> GetNth<T>(this IList<T> list, int n)
{
if (n < 0)
throw new ArgumentOutOfRangeException("n");
if (n > 0)
for (int c = 0; c < list.Count; c += n)
yield return list[c];
}
}
private static readonly string[] sequence = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15".Split(',');
static void Main(string[] args)
{
var every4thElement = sequence
.Where((p, index) => index % 4 == 0);
foreach (string p in every4thElement)
{
Console.WriteLine("{0}", p);
}
Console.ReadKey();
}
산출
Imho 대답이 옳지 않습니다. 모든 솔루션은 0부터 시작합니다.하지만 실제 n 번째 요소를 갖고 싶습니다.
public static IEnumerable<T> GetNth<T>(this IList<T> list, int n)
{
for (int i = n - 1; i < list.Count; i += n)
yield return list[i];
}
@belucha 나는 클라이언트 코드가 매우 읽기 쉽고 컴파일러가 가장 효율적인 구현을 선택하기 때문에 이것을 좋아합니다. IReadOnlyList<T>고성능 LINQ에 대한 요구 사항을 줄이고 부서를 저장하여이를 기반으로합니다.
public static IEnumerable<T> GetNth<T>(this IEnumerable<T> list, int n) {
if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), n, null);
int i = n;
foreach (var e in list) {
if (++i < n) { //save Division
continue;
}
i = 0;
yield return e;
}
}
public static IEnumerable<T> GetNth<T>(this IReadOnlyList<T> list, int n
, int offset = 0) { //use IReadOnlyList<T>
if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), n, null);
for (var i = offset; i < list.Count; i += n) {
yield return list[i];
}
}