与此问题类似,但为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)
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)
Pau*_*ane 10
此代码采取的LukeH的出色答卷,并包装起来作为一个IEnumerable扩展,使您的代码可以处理来讲None,One和Many而不是0,1和2.
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)
其他方式:
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)
| 归档时间: |
|
| 查看次数: |
4250 次 |
| 最近记录: |