programing

목록에서 모든 n번째 항목을 가져오려면 어떻게 해야 합니까?

javajsp 2023. 4. 29. 08:29

목록에서 모든 n번째 항목을 가져오려면 어떻게 해야 합니까?

사용하고 있습니다.NET 3.5 및 매*마다 얻을 수 있기를 원합니다.n*목록에서 세 번째 항목입니다.람다 식이나 LINQ를 사용하여 달성되는지 여부는 신경 쓰지 않습니다.

편집

이 질문은 꽤 많은 논쟁을 불러일으킨 것처럼 보입니다(어느 것이 좋은 것입니까?제가 배운 가장 중요한 것은 여러분이 무언가를 하는 모든 방법을 알고 있다고 생각할 때, 다시 생각해 보세요!

return list.Where((x, i) => i % nStep == 0);

"오래된 학교"라는 것은 알지만, = 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;

번째 편집:

LINQish를 더욱 돋보이게 하기 위해

from var i in Range(0, ((myList.Length-1)/n)+1) select list[n*i];

요소와 함께 인덱스를 전달하는 Where 오버로드를 사용할 수 있습니다.

var everyFourth = list.Where((x,i) => i % 4 == 0);

루프용

for(int i = 0; i < list.Count; i += n)
    //Nth Item..

만약 당신이 linq 확장을 제공한다면, 당신은 가장 특정하지 않은 인터페이스에서 작동할 수 있어야 하고, 따라서 IEnumberable에서 작동해야 한다고 생각합니다.물론, 특히 큰 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];
    }
}

LINQ 표현으로 할 수 있을지 모르겠지만, 당신이 사용할 수 있는 것은 알고 있습니다.Where확장 방법입니다.예를 들어 모든 다섯 번째 항목을 가져옵니다.

List<T> list = originalList.Where((t,i) => (i % 5) == 0).ToList();

이것은 첫 번째 항목과 다섯 번째 항목을 얻을 것입니다.첫 번째 항목 대신 다섯 번째 항목에서 시작하려면 0과 비교하는 대신 4와 비교합니다.

나는 어떤 대답도 옳지 않습니다.모든 솔루션은 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];
        }
    }
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();
}

산출량

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/682615/how-can-i-get-every-nth-item-from-a-listt