类似于Howto:在不迭代的情况下计算 IEnumerable<T> 中的项目?anEnumerable
意味着是一个惰性的、向前读的“列表”,并且像量子力学一样,调查它的行为会改变它的状态。
查看确认:https ://dotnetfiddle.net/GPMVXH
var sideeffect = 0;
var enumerable = Enumerable.Range(1, 10).Select(i => {
// show how many times it happens
sideeffect++;
return i;
});
// will 'enumerate' one item!
if(enumerable.Any()) Console.WriteLine("There are items in the list; sideeffect={0}", sideeffect);
enumerable.Any()
是检查列表中是否有任何项目的最干净的方法。您可以尝试转换为不懒惰的东西,例如if(null != (list = enumerable as ICollection<T>) && list.Any()) return true
.
或者,您的场景可能允许在枚举之前使用Enumerator
并进行初步检查:
var e = enumerable.GetEnumerator();
// check first
if(!e.MoveNext()) return;
// do some stuff, then enumerate the list
do {
actOn(e.Current); // do stuff with the current item
} while(e.MoveNext()); // stop when we don't have anything else