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) | FindAllcould 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 ownIComparer<T>(which is what the second Ruby method
        does) | |
| partition
        { |obj| block } | ||
| reject
        { |obj| block } merely returns the collection of the
        inverse offind_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