私はC#7の新機能、特にローカルメソッドを試していました。私はLinq Where Operatorを書いた。C#7ローカルメソッドで新しい汎用パラメータを再導入することをお勧めしますか?
イテレータブロックをローカルメソッドとして実装しました(実際に、ローカルメソッドは非同期メソッドとイテレータの完璧なソリューションであるという記事を読んでいます)。
これらの2つの実装に違いがあるのか、どちらが最適ではないのだろうか?
最初の実装:ここ
は私が...パラメータのためのローカル方法、新しい名前のための新しいジェネリック型パラメータを導入
public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if(source == null) throw new ArgumentNullException(nameof(source));
if(predicate == null) throw new ArgumentNullException(nameof(predicate));
return WhereIterator(source, predicate);
IEnumerable<TSequence> WhereIterator<TSequence> (IEnumerable<TSequence> localSource, Func<TSequence, bool> localPredicat) {
foreach(TSequence item in localSource) {
if(localPredicat(item)) {
yield return item;
}
}
}
}
第2の実施:
新しい汎用パラメータはありません。新しいpはありませんローカルメソッドは囲むメソッドの変数を取り込むことができるので、arameters。
public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if(source == null) throw new ArgumentNullException(nameof(source));
if(predicate == null) throw new ArgumentNullException(nameof(predicate));
return WhereIterator();
IEnumerable<TSource> WhereIterator() {
foreach(TSource item in source) {
if(predicate(item))
yield return item;
}
}
}
}
なぜWhereIteratorが必要なのかわかりません。あなたはそれを持っていなくて、Whereメソッドでforeachすることができます。 – rokkerboci
デコンパイルされたソース[ここ](https://sharplab.io)をチェックすることができます。それらの機能を記述し、正しい結果を確認するだけです。 –
私は確かな引数の検証が必要です:)、私はWhereIteratorメソッドを使用しない場合、引数の検証が遅れて行われます。 そのため、イテレータをローカルメソッドとして実装しました。 –