2012-09-19 88 views
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); 

我不是在寻找上述代码行的特定答案;他们只是一个展示我想知道的例子。

+5

我不认为C#有一个解决方案,而不是你的最后一个例子。我认为这最后一个例子是很容易理解的。 – zmbq

+0

当您没有直接引用它时,您如何期望直接引用枚举? – asawyer

+3

为什么在'Where'查询中使用条件会给每个项目提供相同的结果? – Rawling

回答

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

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

+0

然后调用网站看起来像'IEnumerable 结果= Enumerable.Range(1,6).WhereSource((source,item)=> source。Count()%2 == 0);'这是一个非常没用的例子,因为它总是'true' – asawyer

+0

所有真正的语句,这就是为什么OP说“我不是在寻找特定的代码行以上;他们只是一个示例,展示我想知道的内容。“ –

0

不,你不能因为Enumerable.Range(1, 6))没有名字。

你将如何调用一个没有名字的实体。

您的第三个片段是您可以使用的唯一解决方案,因为它没有名称来引用。

但是你可以做

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); 
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} 
+0

他正在采取收集的长度,而不是指数的mod。 –

+3

@NikhilAgrawal我明白了......但是有没有什么意义......他只能做到'6%2' ......为什么要枚举? – horgh

+1

可能是该值作为参数传递。 –