Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 高效Linq可枚举';s';Count()==1';测试_C#_Linq - Fatal编程技术网

C# 高效Linq可枚举';s';Count()==1';测试

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

与此类似,但对Linq进行了重新表述:


您可以使用
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);