我怎样才能得到列表<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(); }
产量