使用 IEnumerable 时,基本原则是惰性求值,即仅在需要时才检索元素。然而,有时我们可能会发现自己处于这样一种情况:我们需要知道集合中项目的数量而不需要迭代它们。
考虑以下代码片段:
private IEnumerable<string> Tables { get { yield return "Foo"; yield return "Bar"; } }
如果我们想要迭代这个集合并将进度显示为“处理 #n of #m”,我们如何确定 m 的值而不需要迭代?
IEnumerable 的限制
不幸的是,这对于 IEnumerable 是不可能的。根据设计,它是惰性运行的,仅在请求时生成元素。预先确定总计数需要预先遍历,从而违背了惰性求值的目的。
ICollection 来救援
如果在不迭代的情况下知道计数至关重要,请考虑使用 ICollection 代替。 ICollection 是一个接口,表示可以提供有关其内容的信息的集合。它包含一个 Count 属性,用于返回集合中的元素数量。
private ICollection<string> Tables { get { return new List<string> { "Foo", "Bar" }; } } int count = Tables.Count;
通过将 Tables 转换为 List
总之,虽然 IEnumerable 因其在惰性计算方面的效率而引人注目,但它预先缺乏计数信息可能是一个限制。对于必须事先知道计数的情况,请考虑使用 ICollection。
以上是如何在不迭代的情况下获取 IEnumerable 的计数?的详细内容。更多信息请关注PHP中文网其他相关文章!