C# 高效Linq可枚举';s';Count()==1';测试
与此类似,但对Linq进行了重新表述:C# 高效Linq可枚举';s';Count()==1';测试,c#,linq,C#,Linq,与此类似,但对Linq进行了重新表述: 您可以使用Enumerable.Any()测试可枚举文件是否包含数据。但是,如果不使用昂贵的计数操作,测试枚举表是否包含单个值(即enumerable.Count()==1)或大于单个值(即enumerable.Count()>1)的有效方法是什么 int constrainedCount = yourSequence.Take(2).Count(); // if constrainedCount == 0 then the sequence is em
您可以使用
Enumerable.Any()
测试可枚举文件是否包含数据。但是,如果不使用昂贵的计数操作,测试枚举表是否包含单个值(即enumerable.Count()==1
)或大于单个值(即enumerable.Count()>1
)的有效方法是什么
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
public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
using (var enumerator = enumerable.GetEnumerator()) {
if (!enumerator.MoveNext()) {
return false;
}
return !enumerator.MoveNext();
}
}
publicstaticboolissingle(此IEnumerable可枚举){
使用(var enumerator=enumerable.GetEnumerator()){
如果(!enumerator.MoveNext()){
返回false;
}
return!枚举数.MoveNext();
}
}
使用linq to对象,如果有多个元素,SingleOrDefault将抛出,因此如果您自己使用,可能是最好的选择
编辑:现在我看到了卢卡的答案,我不得不说我更喜欢它。但愿我自己能想到 另一种方式:
bool containsMoreThanOneElement = yourSequence.Skip(1).Any();
或仅针对1个元素:
bool containsOneElement = yourSequence.Any() && !yourSequence.Skip(1).Any();
此代码接受了LukeH的优秀答案,并将其包装为一个
IEnumerable
扩展,这样您的代码就可以处理None
、One
和Many
而不是0
、1
和2
public enum Multiplicity
{
None,
One,
Many,
}
在静态类中,例如,EnumerableExtensions
:
public static Multiplicity Multiplicity<TElement>(this IEnumerable<TElement> @this)
{
switch (@this.Take(2).Count())
{
case 0: return General.Multiplicity.None;
case 1: return General.Multiplicity.One;
case 2: return General.Multiplicity.Many;
default: throw new Exception("WTF‽");
}
}
公共静态多重性多重性(this IEnumerable@this)
{
开关(@this.Take(2.Count())
{
案例0:返回General.multiplity.None;
案例1:返回General.multiplity.One;
案例2:返回General.multiplity.Many;
默认值:抛出新异常(“WTF”->);
}
}
有效计数()==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();
}
}
公共静态bool countisqualto(此IEnumerable可枚举,int c)
{
使用(var enumerator=enumerable.GetEnumerator())
{
对于(变量i=0;i
…对于值可以为null的类,这可能会有用。这是我倾向于使用的,但LukeH的约束计数非常漂亮。@Paul-是的,它将
seq.Any()
和seq.Skip(1.Any()
封装到一个漂亮的语句中。您需要将其与其他语句配对,以查看计数是否为1。但是,这涵盖了>1场景。Single()抛出-SingleOrDefault()将返回泛型类型的默认值(引用类型为null)。@David:Nope,SingleOrDefault
将在有多个元素时抛出。如果没有元素,它只返回default(T)
。@David,他关于SingleOrDefault
的评论是正确的。Single
和SingleOrDefault
之间的区别不在于它们是否抛出,而只是当一个度量值毫无价值时。您需要计算平均值和标准偏差。在我的机器上,差异是并没有意义的。请确保不要处理序列数据本身,因为在某些情况下跳过或获取可能会丢失/消耗数据。如果你只关心计数就可以了。
bool hasTwo = yourSequence.ElementAtOrDefault(1) != default(T);