On the topic of Ruby's Enumerable mixin, it might be interesting to
compare them to C# 2.0's Array/List<T> methods—static for Array, instance for List<T>—and 3.0's Standard Query
Operators (System.Query namespace).
In the cases where C# does not support the method, I'd recommend following the link to the ruby docs. There are some rather interesting methods, and a lot can be learned from looking at what other languages support. In fact, some of these methods (each_slice, each_with_index) might be worth implementing as extension methods in C# (a trivial excercise left to the reader).
| Ruby Enumerable | C# 2.0 Array/List<T> methods* | C# 3.0 System.Query |
|---|---|---|
all?all?
{ |obj| block } |
bool TrueForAll(Predicate<T> match) |
bool All<T>(this IEnumerable<T> source,
Func<T, bool> predicate) |
any?any?
{ |obj| block } |
bool Exists(Predicate<T> match) |
bool Any<T>(this IEnumerable<T> source,
Func<T, bool> predicate) |
collect
{ |obj| block }map
{ |obj| block} |
List<TOutput> ConvertAll<TOutput>(Converter<T,
TOutput> converter) |
IEnumerable<S> Select<T, S>(this
IEnumerable<T> source, Func<T, S> selector) |
detect(ifnone
= nil) { |obj| block }find(ifnone
= nil) { |obj| block } |
T Find(Predicate<T> match) |
T First<T>(this IEnumerable<T> source, Func<T,
bool> predicate)T FirstOrDefault<T>(this IEnumerable<T> source,
Func<T, bool> predicate) |
each_cons(n)
{...} |
||
each_slice(n)
{...} |
||
each_with_index
{ |obj, index| block } |
||
to_aentries |
T[] ToArray<T>(this IEnumerable<T>
source)List<T> ToList<T>(this IEnumerable<T>
source) |
|
find_all
{ |obj| block }select
{ |obj| block } |
List<T> FindAll(Predicate<T> match) |
IEnumerable<T> Where(this IEnumerable<T> source,
Func<T, bool> predicate) |
grep(pattern) |
FindAll could certainly specify a predicate that
applied a regular expression against each item of the collection. |
same for Where. |
include?(obj) |
bool Contains(T item) |
|
inject(initial)
{ |memo, obj| block } |
U Aggregate<T, U>(this IEnumerable<T> source, U
seed, Func<U, T, U> func) |
|
max
/ minmax
/ min
{ |a, b| block } |
T Max/Min<T>(this IEnumerable<T> source),
etc. Note that while there are a few overloads for this method, it
looks like the delegates passed in merely provide value extraction. I
don't see an overload where you can provide your own
IComparer<T> (which is what the second Ruby method
does) |
|
partition
{ |obj| block } |
||
reject
{ |obj| block } merely returns the collection of the
inverse of find_all
/ select |
||
sortsort
{ |a, b | block }sort_by
{ |obj| block } |
Sort()Sort(IComparer<T> comparison) |
OrderedSequence<T, K>
OrderBy/OrderByDescending/ThenBy/ThenByDescending(OrderedSequence<T>
OrderBy/OrderByDescending/ThenBy/ThenByDescending( |
to_set |
||
zip(arg,
...)zip(arg,
...) { |arr| block } |
No comments:
Post a Comment