.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]
代わりに単にreturnを返すのlist[n-1]
ですか?
要素と共にインデックスを渡すWhereオーバーロードを使用できます
var everyFourth = list.Where((x,i) => i % 4 == 0);
ループ
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();
}
出力
いも正解はありません。すべての解は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];
}
}