代码之家  ›  专栏  ›  技术社区  ›  Paul Suart Wes

如何从列表中获取每N个项目?

  •  97
  • Paul Suart Wes  · 技术社区  · 15 年前

    n *列表中的第项。我并不担心它是使用lambda表达式还是LINQ实现的。

    编辑

    9 回复  |  直到 15 年前
        1
  •  211
  •   mqp    15 年前
    return list.Where((x, i) => i % nStep == 0);
    
        2
  •  39
  •   Michael Todd    15 年前

    我知道这是“老派”,但为什么不使用带有stepping=n的for循环呢?

        3
  •  37
  •   Luc Morin    8 年前

    听起来像

    IEnumerator<T> GetNth<T>(List<T> list, int n) {
      for (int i=0; i<list.Count; i+=n)
        yield return list[i]
    }
    

    我会成功的。我认为没有必要使用Linq或lambda表达式。

    编辑:

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

    你用林奇的方式写作

    from var element in MyList.GetNth(10) select element;
    

    第二版 :

    让它更灵气

    from var i in Range(0, ((myList.Length-1)/n)+1) select list[n*i];
    
        4
  •  29
  •   JaredPar    15 年前

    var everyFourth = list.Where((x,i) => i % 4 == 0);
    
        5
  •  10
  •   Quintin Robinson    15 年前

    For循环

    for(int i = 0; i < list.Count; i += n)
        //Nth Item..
    
        6
  •  5
  •   belucha    10 年前

    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];
        }
    }
    
        7
  •  3
  •   Guffa    15 年前

    Where 扩展方法来完成它。例如,要获得每五个项目:

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

    这将得到第一个项目,并从那里每隔五个。如果要从第五项而不是第一项开始,请与4进行比较,而不是与0进行比较。

        8
  •  1
  •   Spoc    5 年前

    @belucha我喜欢这样,因为客户机代码可读性很强,编译器选择最有效的实现。在此基础上,我将把需求减少到 IReadOnlyList<T>

        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];
            }
        }
    
        9
  •  0
  •   Tunaki Vishal Singh    8 年前
    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();
    }
    

    输出

    enter image description here

        10
  •  0
  •   user2340145    7 年前

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