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

时间:2011-05-19 13:43:25

标签: c# linq

与此question类似,但为Linq重新定义:

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

7 个答案:

答案 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扩展名进行包装,以便您的代码能够处理NoneOneMany而非{ {1}},01

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,那么这可能对我们有用。