1

同じ列挙可能ファイルで実行されているメソッド内で列挙可能ソースを参照する方法はありますか?

たとえば、このコードは、元の列挙可能な1〜6の範囲を繰り返します。

IEnumerable<int> result = Enumerable.Range(1, 6)
    .Where(a => Enumerable.Range(1, 6).Count() % 2 == 0);

次のように、元の列挙可能なものを繰り返してそれを生成するためのよりクリーンな方法があるかどうかを知りたいです。

IEnumerable<int> result = Enumerable.Range(1, 6)
    .Where(a => [source reference].Count() % 2 == 0);

はい、私は次のことが解決策であることを知っています...しかし、上で示したように、メモリ内の列挙可能なものを直接参照する方法はありますか?

IEnumerable<int> source = Enumerable.Range(1, 6);
IEnumerable<int> result = source.Where(a => source.Count() % 2 == 0);

上記のコード行に対する具体的な答えを探しているわけではありません。それらは私が知りたいことを示す単なる例です。

4

3 に答える 3

2

組み込みのIEnumerable拡張メソッドはどれも、あなたが望むことをすることができません。これらはすべて、個々のアイテムに対してのみ機能するランバ式を受け入れるため、式は親コンテナにアクセスできません。

ただし、次のようなものを使用することを妨げるものはありません。

public static IEnumerable<T> WhereSource<T> ( this IEnumerable<T> source, Func<IEnumerable<T>, T, bool> predicate)
{
  foreach (var item in source)
  {
    if (predicate(source, item))
    {
      yield return item;    
    }
  }
}

個人的には、元のソリューションは、独自のカスタム拡張メソッドを作成するよりもはるかに明確で、保守が容易で、優れていると思いますが、それは確かに可能です。

于 2012-09-19T12:26:44.343 に答える
1

これですか?

IEnumerable<int> source = Enumerable.Range(1, 6); //{1,2,3,4,5,6}
IEnumerable<int> result = source.Where((a, i) => i % 2 == 0); //{1,3,5}
IEnumerable<int> result2 = source.Where(a => a % 2 == 0); //{2,4,6}
于 2012-09-19T12:23:17.930 に答える
0

いいえ、名前がないのでできませんEnumerable.Range(1, 6))

名前のないエンティティをどのように呼び出しますか。

3番目のスニペットは、参照する名前がないため、使用できる唯一のソリューションです。

しかし、あなたはすることができます

int length = 6; // Here hard-coded but can be passed from a parameter.
IEnumerable<int> source = Enumerable.Range(1, Length);
IEnumerable<int> result = source.Where(a => length % 2 == 0);
于 2012-09-19T12:21:01.670 に答える