While we're on the topic, it's interesting to note that mscorlib defines the following operations on arrays:
namespace System {
public abstract class Array {
public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] input, Converter<TInput, TOutput> cc);
public static bool Exists<T>(T[] array, Predicate<T> match);
public static T Find<T>(T[] array, Predicate<T> match);
public static T FindLast<T>(T[] array, Predicate<T> match);
public static T[] FindAll<T>(T[] array, Predicate<T> match);
public static int FindIndex<T>(T[] array, Predicate<T> match);
public static int FindLastIndex<T>(T[] array, Predicate<T> match);
public static void ForEach<T>(T[] array, Action<T> action);
public static void Sort<T>(T[] array, Comparison<T> comparer);
public static bool TrueForAll<T>(T[] array, Predicate<T> match);
}
}
which rely on the following pre-defined delegate signatures:
namespace System {
public delegate void Action<T>(T item);
public delegate int Comparer<T>(T first, T second); // result works like strcmp
public delegate TOutput Converter<TInput, TOutput>(TInput input);
public delegate bool Predicate<T>(T item);
}
Here's some code that puts these methods through their paces:
int[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int lastOdd = Array.FindLast(list, delegate(int n) { return n % 2 == 1; });
// lastOdd is 9
int[] evens = Array.FindAll(list, delegate(int n) { return n % 2 == 0; });
// evens contains { 2, 4, 6, 8, 10 }
bool hasMultipleOfSeven = Array.Exists(evens, delegate(int n) { return n % 7 == 0; });
// hasMultipleOfSeven is false
Array.Sort(evens, delegate(int a, int b) { return b - a; });
// evens is now { 10, 8, 6, 4, 2 }
string[] s = Array.ConvertAll<int, string>(evens, delegate(int n) { return "#" + n.ToString(); });
// s is { "#10", "#8", "#6", "#4", "#2" }
Yes, it would be nice if the compiler could do the inferencing for ConvertAll. Unfortunately, the compiler won't inference the delegate signature based on the return type, hence the explicit <int, string>.
Posted
Apr 23 2005, 02:01 PM
by
don-box