高效的Linq Enumerable的'Count()== 1'测试

E.B*_*ach 30 c# linq

与此问题类似,但为Linq重新说明:

您可以Enumerable<T>.Any()用来测试枚举是否包含数据.但是,如果不使用昂贵的计数操作,测试枚举是否包含单个值(即Enumerable<T>.Count() == 1)或大于单个值(即Enumerable<T>.Count() > 1)的有效方法是什么?

Luk*_*keH 64

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
Run Code Online (Sandbox Code Playgroud)

  • 确保您不使用 yourSequence 数据本身,因为在某些情况下跳过或获取可能会丢失/使用数据。如果您只关心计数,那没关系。 (2认同)

Jar*_*Par 15

一种方法是编写新的扩展方法

public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
  using (var enumerator = enumerable.GetEnumerator()) {
    if (!enumerator.MoveNext()) {
      return false;
    }
    return !enumerator.MoveNext();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @CodeArtist一个衡量标准毫无价值.您需要计算平均值和标准差.在我的机器上,差异毫无意义. (2认同)

Pau*_*ane 10

此代码采取的LukeH的出色答卷,并包装起来作为一个IEnumerable扩展,使您的代码可以处理来讲None,OneMany而不是0,12.

public enum Multiplicity
{
    None,
    One,
    Many,
}
Run Code Online (Sandbox Code Playgroud)

在静态类中,例如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?");
    }
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ked 9

其他方式:

bool containsMoreThanOneElement = yourSequence.Skip(1).Any();
Run Code Online (Sandbox Code Playgroud)

或者恰好是1个元素:

bool containsOneElement = yourSequence.Any() && !yourSequence.Skip(1).Any();
Run Code Online (Sandbox Code Playgroud)