Changeset 36039

Show
Ignore:
Timestamp:
11/29/09 22:46:08 (4 years ago)
Author:
takeshik
Message:

Fixed bugs.
Added extension methods.

Location:
lang/csharp/LINX/trunk/Linx
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/csharp/LINX/trunk/Linx/Collections/HybridDictionary.cs

    r36029 r36039  
    3333using Achiral; 
    3434using Achiral.Extension; 
     35using XSpect.Extension; 
    3536 
    3637namespace XSpect.Collections 
     
    4041        : IDictionary<TKey, TValue>, 
    4142          IList<KeyValuePair<TKey, TValue>>, 
    42           IList<TValue>, 
    43           IEnumerable<HybridDictionary<TKey, TValue>.Tuple> 
     43          IList<TValue> 
    4444    { 
    4545        private Dictionary<TKey, TValue> _dictionary; 
     
    444444        protected virtual void InsertItems(IEnumerable<Int32> indexes, IEnumerable<TKey> keys, IEnumerable<TValue> values, Boolean ensureKeysCompliant) 
    445445        { 
    446             IEnumerable<Tuple> elements = indexes 
    447                 .ZipWith(keys, (i_, k_) => 
    448                     values.ZipWith( 
    449                         ensureKeysCompliant || this.KeySelector == null 
    450                             ? Make.Repeat(true) 
    451                             : keys.ZipWith( 
    452                                   indexes.ZipWith(values, (i, v) => 
    453                                       this.KeySelector(i, v) 
    454                                   ), 
    455                                   (k, s) => k.Equals(s) 
    456                               ), 
    457                         (v_, c_) => new Tuple(i_, k_, v_, c_) 
    458                     ) 
    459                 ) 
    460                 .SelectMany(e => e); 
     446            IEnumerable<Tuple> elements = indexes.ZipWith( 
     447                keys, 
     448                values, 
     449                ensureKeysCompliant || this.KeySelector == null 
     450                    ? Make.Repeat(true) 
     451                    : indexes.ZipWith( 
     452                          keys, 
     453                          values, 
     454                          (i_, k_, v_) => this.KeySelector(i_, v_).Equals(k_) 
     455                      ), 
     456                (i, k, v, c) => new Tuple(i, k, v, c) 
     457            ); 
    461458            List<Int32> insertedIndexes = new List<Int32>(); 
    462459            foreach (Tuple e in elements) 
     
    485482        protected virtual void SetItems(IEnumerable<Int32> indexes, IEnumerable<TKey> keys, IEnumerable<TValue> values) 
    486483        { 
    487             IEnumerable<Tuple> elements = indexes 
    488                 .ZipWith(keys, (i_, k_) => 
    489                     values.ZipWith( 
    490                         this.KeySelector == null 
    491                             ? Make.Repeat(true) 
    492                             : keys.ZipWith( 
    493                                   indexes.ZipWith(values, (i, v) => 
    494                                       this.KeySelector(i, v) 
    495                                   ), 
    496                                   (k, s) => k.Equals(s) 
    497                               ), 
    498                         (v_, c_) => new Tuple(i_, k_, v_, c_) 
    499                     ) 
    500                 ) 
    501                 .SelectMany(e => e); 
     484            IEnumerable<Tuple> elements = indexes.ZipWith( 
     485                keys, 
     486                values, 
     487                this.KeySelector == null 
     488                    ? Make.Repeat(true) 
     489                    : indexes.ZipWith( 
     490                          keys, 
     491                          values, 
     492                          (i_, k_, v_) => this.KeySelector(i_, v_).Equals(k_) 
     493                      ), 
     494                (i, k, v, c) => new Tuple(i, k, v, c) 
     495            ); 
    502496            foreach (Tuple e in elements) 
    503497            { 
  • lang/csharp/LINX/trunk/Linx/Extension/IEnumerableUtil.cs

    r35471 r36039  
    8080                : String.Empty; 
    8181        } 
     82 
     83        public static IEnumerable<TResult> ZipWith<T1, T2, T3, TResult>( 
     84            this IEnumerable<T1> source1, 
     85            IEnumerable<T2> source2, 
     86            IEnumerable<T3> source3, 
     87            Func<T1, T2, T3, TResult> func) 
     88        { 
     89            using (IEnumerator<T1> enumerator1 = source1.GetEnumerator()) 
     90            using (IEnumerator<T2> enumerator2 = source2.GetEnumerator()) 
     91            using (IEnumerator<T3> enumerator3 = source3.GetEnumerator()) 
     92            { 
     93                while (enumerator1.MoveNext() && enumerator2.MoveNext() && enumerator3.MoveNext()) 
     94                { 
     95                    yield return func(enumerator1.Current, enumerator2.Current, enumerator3.Current); 
     96                } 
     97            } 
     98        } 
     99 
     100        public static IEnumerable<TResult> ZipWith<T1, T2, T3, T4, TResult>( 
     101            this IEnumerable<T1> source1, 
     102            IEnumerable<T2> source2, 
     103            IEnumerable<T3> source3, 
     104            IEnumerable<T4> source4, 
     105            Func<T1, T2, T3, T4, TResult> func) 
     106        { 
     107            using (IEnumerator<T1> enumerator1 = source1.GetEnumerator()) 
     108            using (IEnumerator<T2> enumerator2 = source2.GetEnumerator()) 
     109            using (IEnumerator<T3> enumerator3 = source3.GetEnumerator()) 
     110            using (IEnumerator<T4> enumerator4 = source4.GetEnumerator()) 
     111            { 
     112                while (enumerator1.MoveNext() && enumerator2.MoveNext() && enumerator3.MoveNext() && enumerator4.MoveNext()) 
     113                { 
     114                    yield return func(enumerator1.Current, enumerator2.Current, enumerator3.Current, enumerator4.Current); 
     115                } 
     116            } 
     117        } 
     118 
     119        public static IEnumerable<TResult> ZipWith<T1, T2, T3, TResult>( 
     120            this IEnumerable<T1> source1, 
     121            IEnumerable<T2> source2, 
     122            IEnumerable<T3> source3, 
     123            Func<T1, T2, T3, Int32, TResult> func) 
     124        { 
     125            using (IEnumerator<T1> enumerator1 = source1.GetEnumerator()) 
     126            using (IEnumerator<T2> enumerator2 = source2.GetEnumerator()) 
     127            using (IEnumerator<T3> enumerator3 = source3.GetEnumerator()) 
     128            { 
     129                Int32 index = 0; 
     130                while (enumerator1.MoveNext() && enumerator2.MoveNext() && enumerator3.MoveNext()) 
     131                { 
     132                    yield return func(enumerator1.Current, enumerator2.Current, enumerator3.Current, index); 
     133                    ++index; 
     134                } 
     135            } 
     136        } 
     137 
     138        public static IEnumerable<TResult> ZipWith<T1, T2, T3, T4, TResult>( 
     139            this IEnumerable<T1> source1, 
     140            IEnumerable<T2> source2, 
     141            IEnumerable<T3> source3, 
     142            IEnumerable<T4> source4, 
     143            Func<T1, T2, T3, T4, Int32, TResult> func) 
     144        { 
     145            using (IEnumerator<T1> enumerator1 = source1.GetEnumerator()) 
     146            using (IEnumerator<T2> enumerator2 = source2.GetEnumerator()) 
     147            using (IEnumerator<T3> enumerator3 = source3.GetEnumerator()) 
     148            using (IEnumerator<T4> enumerator4 = source4.GetEnumerator()) 
     149            { 
     150                Int32 index = 0; 
     151                while (enumerator1.MoveNext() && enumerator2.MoveNext() && enumerator3.MoveNext() && enumerator4.MoveNext()) 
     152                { 
     153                    yield return func(enumerator1.Current, enumerator2.Current, enumerator3.Current, enumerator4.Current, index); 
     154                    ++index; 
     155                } 
     156            } 
     157        } 
    82158    } 
    83159}