有没有办法在同一个可枚举的运行方法中引用可枚举的源?
例如,此代码重复原始的可枚举范围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);
我不是在寻找上面代码行的具体答案;它们只是展示我想知道的一个例子。
答案 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);