17

我有以下返回IEnumerable类型的方法Tyield return该方法的实现并不重要,除了延迟加载. IEnumerable这是必要的,因为结果可能有数百万个项目。

public IEnumerable<T> Parse()
{
    foreach(...)
    {
        yield return parsedObject;
    }
}

问题:

我有以下属性,可用于确定IEnumerable遗嘱是否有任何物品:

public bool HasItems
{
    get
    {
        return Parse().Take(1).SingleOrDefault() != null;
    }
}

有没有更好的方法来做到这一点?

4

2 回答 2

42

IEnumerable.Any()true如果序列中有任何元素并且序列中没有元素,则将返回false。此方法不会迭代整个序列(最多只有一个元素),因为如果它超过第一个元素,它将返回 true,否则返回 false。

于 2013-06-04T10:31:00.680 回答
8

类似于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
于 2016-09-01T17:15:35.467 回答