与此question类似,但为Linq重新定义:
您可以使用Enumerable<T>.Any()
来测试枚举是否包含数据。但是,如果不使用昂贵的计数操作,测试枚举是否包含单个值(即Enumerable<T>.Count() == 1
)或大于单个值(即Enumerable<T>.Count() > 1
)的有效方法是什么?
答案 0 :(得分:63)
int constrainedCount = yourSequence.Take(2).Count();
// if constrainedCount == 0 then the sequence is empty
// if constrainedCount == 1 then the sequence contains a single element
// if constrainedCount == 2 then the sequence has more than one element
答案 1 :(得分:15)
一种方法是编写新的扩展方法
public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
using (var enumerator = enumerable.GetEnumerator()) {
if (!enumerator.MoveNext()) {
return false;
}
return !enumerator.MoveNext();
}
}
答案 2 :(得分:10)
此代码采用了LukeH的优秀答案,并将其作为IEnumerable
扩展名进行包装,以便您的代码能够处理None
,One
和Many
而非{ {1}},0
和1
。
2
在静态类中,例如public enum Multiplicity
{
None,
One,
Many,
}
:
EnumerableExtensions
答案 3 :(得分:9)
另一种方式:
bool containsMoreThanOneElement = yourSequence.Skip(1).Any();
或者恰好是1个元素:
bool containsOneElement = yourSequence.Any() && !yourSequence.Skip(1).Any();
答案 4 :(得分:2)
高效Count() == n
测试:
public static bool CountIsEqualTo<T>(this IEnumerable<T> enumerable, int c)
{
using (var enumerator = enumerable.GetEnumerator())
{
for(var i = 0; i < c ; i++)
if (!enumerator.MoveNext())
return false;
return !enumerator.MoveNext();
}
}
答案 5 :(得分:1)
使用linq到对象时,如果有多个元素,则抛出SingleOrDefault,因此如果您自己滚动,则可能最好。
编辑:现在我看到了LukeH的答案,我不得不说我更喜欢它。希望我自己想到它!
答案 6 :(得分:0)
bool hasTwo = yourSequence.ElementAtOrDefault(1) != default(T);
...如果类的值可以为null,那么这可能对我们有用。