在可枚举的方法中引用可枚举的源代码?

时间:2012-09-19 12:13:18

标签: c# .net ienumerable

有没有办法在同一个可枚举的运行方法中引用可枚举的源?

例如,此代码重复原始的可枚举范围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);

我不是在寻找上面代码行的具体答案;它们只是展示我想知道的一个例子。

3 个答案:

答案 0 :(得分:2)

内置的IEnumerable扩展方法都不能满足您的需求。它们都接受仅对单个项目进行操作的lamba表达式,因此表达式无法访问父容器。

没有什么可以阻止你自己滚动,比如:

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

就我个人而言,我认为您的原始解决方案更清晰,更易于维护,并且比制作您自己的自定义扩展方法更好,但这当然是可能的。

答案 1 :(得分: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}

答案 2 :(得分: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);