Count()
扫描所有元素,因此如果enumerable包含很多元素,if (list.Count() == 1)
将不能很好地执行。Single()
会在并非只有一个元素时掷回例外状况。使用try { list.Single(); } catch(InvalidOperationException e) {}
会很笨拙且效率不高。
如果有一个以上的项目,SingleOrDefault()
会掷回例外状况,因此if (list.SingleOrDefault() == null)
(假设TSource
是指涉型别)将无法用于大小大于1的可枚举项目。
7条答案
按热度按时间hts6caw31#
如果元素较少,
Take
扩展方法不会抛出,它只返回可用的元素。siotufzp2#
更直接:
但是请注意,您只能保证一次读取序列,因此 * 在这些情况下 *:通过简单的检查是否有一个单一的项目,你就不能再得到这个项目了。2所以你可能更喜欢一些如果有价值的东西:
2jcobegt3#
为了避免其他答案中的额外迭代,您可以实现自己的扩展:
guykilcj4#
您可以使用
!Skip(1).Any()
:如果类型是集合,您可以建立更有效率的延伸:
用法:
您可以将此扩展名用于任何类型和任何计数,因此不仅1
izkcnapc5#
我建议玩
Any
,我们必须检查一下list
至少有一个项目-Any
list
没有第二个项目-!list.Skip(1).Any()
编码:
然而,这种方法具有缺点:它扫描
list
* 两次 *,这在IQueryable
的情况下可能是个问题(查询执行 * 两次 *,结果可能不同,并产生额外开销)mznpcxlj6#
您在原始可枚举对象上调用的每个Linq方法调用(
.Any()
、.Skip()
、...)都会创建一个枚举数,根据您的要求,这也可能会对性能造成相当大的影响。所以你可以用
.Take(2).Count() == 1
。另请参阅There's a most performant way to check that a collection has exactly 1 element?。
fv2wmkja7#
如果出于某种原因不想使用Linq,也可以手动使用Enumerator: