参考@walpen 的回答,指出All 是Linq 扩展(在System.Linq.Enumerable 中定义)。
我想提供All 的 .NET 2.0 实现,作为扩展。
首先,我们将定义一个名为ExtensionAttribute 的Attribute。 (所以参考:Using extension methods in .NET 2.0?)
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class
| AttributeTargets.Method)]
public sealed class ExtensionAttribute : Attribute { }
}
然后,(通过魔术)我们可以使用this 引用进行扩展。因此,我们将创建一个static class 以供ExtensionAttribute 使用:我选择通过在System.Collections.Generic 命名空间中定义一个名为Enumerable 的static class 来实现。
namespace System.Collections.Generic
{
public static class Enumerable
{
//[System.Runtime.CompilerServices.Extension()]
public static bool All<T>(this IEnumerable<T> list, T expectedAnswer)
where T : IEquatable<T>, IComparable<T>
{
bool result = true;
IEnumerator<T> enumerator = list.GetEnumerator();
while (enumerator.MoveNext())
{
result = result && (Object.Equals(enumerator.Current, expectedAnswer));
if (!result)
return result;
}
return result;
}
public delegate bool MyFunc<T>(T next);
public static bool All<T>(this IEnumerable<T> list, MyFunc<T> fn)
where T : IEquatable<T>, IComparable<T>
{
bool result = true;
IEnumerator<T> enumerator = list.GetEnumerator();
while (enumerator.MoveNext())
{
result = result && fn.Invoke(enumerator.Current);
if (!result)
return result;
}
return result;
}
}
}
那么,使用它就很简单了。
IEnumerable<int> ints = new int[] { 2 + 2, 2 * 2, 1 * 3 + 1 };
Console.Write("Result := {0}", ints.All(4)); // outputs "Result := true"
Console.Write("Result := {0}", ints.All(t => t.Equals(4))); // outputs "Result := true"