我怎样才能得到列表<T>中的每一个项目?

我正在使用.NET 3.5,并希望能够获得列表中的每个* n *项。 我不关心它是否使用lambdaexpression式或LINQ来实现。

编辑

看起来这个问题引起了很多辩论(这是一件好事,对吧?)。 我学到的主要事情是,当你认为你知道每一种做法(即使这样简单),再想一想!

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

我知道这是“老派”,但是为什么不直接用step = 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或lambdaexpression式。

编辑:

做了

 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 Loop

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

我不知道是否可以用LINQexpression式,但我知道你可以使用Where扩展方法来做到这一点。 例如要获得每五个项目:

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

这会得到第一个项目,每五分之一。 如果你想从第五个项目开始,而不是第一个,你比较4而不是与0比较。

我想如果你提供了一个linq扩展,你应该可以在最不特定的接口上操作,因此在IEnumerable上。 当然,如果你的速度特别是大N,你可能会提供索引访问的过载。 后者消除了迭代大量不需要的数据的需要,并且将比Where子句快得多。 提供这两种重载,编译器可以select最合适的变体。

 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(); } 

产量

在这里输入图像描述