Ejemplo n.º 1
0
 /// <summary>
 /// Fusioniert zwei Arrays zu einem teilbaren Container Array
 /// </summary>
 /// <typeparam name="T1">Typ1</typeparam>
 /// <typeparam name="T2">Typ2</typeparam>
 /// <param name="t1">Das erweiterte Objekt</param>
 /// <param name="t2">Der zweite Array</param>
 /// <returns>Einen teilbaren Container Array</returns>
 /// <exception cref="IndexOutOfRangeException">Wenn die Arrays unterschiedlich lang sind</exception>
 /// <example>
 /// <para>
 /// Mit der Bindung zweier Objekte kann man z.B. Änderungen von Positionen in Collections an beiden Objekten gleichzeitig durchführen,
 /// ohne einen eigenen Algorithmus zu schreiben. Hier wird ein <see cref="string"/>-<see cref="Array"/> von mit Zahl-Representationen anhand ihrer
 /// Zahl-Equivalente sortiert (der <see cref="int"/>-<see cref="Array"/>)
 /// </para>
 /// <code>
 /// string[]    aa = new string[]   { "eins", "drei", "zwei", "minus vier" };
 /// int[]       bb = new int[]      { 1,      3,      2,      -4           };
 ///
 /// aa.Fuse(bb).OrderBy(i => i.Item2).DeFuse(out aa, out bb);
 /// //aa: { "minus vier", "eins", "zwei", "drei" }
 /// //bb: { -4, 1, 2, 3 }
 /// </code>
 /// </example>
 public static FusionTuple <T1, T2>[] Fuse <T1, T2>(this T1[] t1, T2[] t2)
 {
     if (t1.Length != t2.Length)
     {
         throw new IndexOutOfRangeException("uneven array-lengths");
     }
     FusionTuple <T1, T2>[] result = new FusionTuple <T1, T2> [t1.Length];
     for (int i = 0; i < t1.Length; i++)
     {
         result[i] = new FusionTuple <T1, T2>(t1[i], t2[i]);
     }
     return(result);
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Fusioniert zwei <see cref="IEnumerable"/>s zu einem teilbaren Container Array
        /// </summary>
        /// <typeparam name="T1">Typ1</typeparam>
        /// <typeparam name="T2">Typ2</typeparam>
        /// <param name="c1">Das erweiterte Objekt</param>
        /// <param name="c2">Die zweite <see cref="ICollection"/></param>
        /// <returns>Einen teilbaren Container Array</returns>
        ///<exception cref="IndexOutOfRangeException">Wenn die Enumerationen unterschiedlich lang sind</exception>
        ///        /// <example>
        /// <para>
        /// Mit der Bindung zweier Objekte kann man z.B. Änderungen von Positionen in Collections an beiden Objekten gleichzeitig durchführen,
        /// ohne einen eigenen Algorithmus zu schreiben. Hier wird ein <see cref="string"/>-<see cref="Array"/> von mit Zahl-Representationen anhand ihrer
        /// Zahl-Equivalente sortiert (der <see cref="int"/>-<see cref="Array"/>)
        /// </para>
        /// <code>
        /// string[]    aa = new string[]   { "eins", "drei", "zwei", "minus vier" };
        /// int[]       bb = new int[]      { 1,      3,      2,      -4           };
        ///
        /// aa.Fuse(bb).OrderBy(i => i.Item2).DeFuse(out aa, out bb);
        /// //aa: { "minus vier", "eins", "zwei", "drei" }
        /// //bb: { -4, 1, 2, 3 }
        /// </code>
        /// </example>
        public static FusionTuple <T1, T2>[] Fuse <T1, T2>(this ICollection <T1> c1, ICollection <T2> c2)
        {
            if (c1.Count != c2.Count)
            {
                throw new IndexOutOfRangeException("uneven collection-counts");
            }

            int counter = 0;

            FusionTuple <T1, T2>[] result = new FusionTuple <T1, T2> [c1.Count];
            IEnumerator <T1>       enu1   = c1.GetEnumerator();
            IEnumerator <T2>       enu2   = c2.GetEnumerator();

            while (enu1.MoveNext() && enu2.MoveNext())
            {
                result[counter++] = new FusionTuple <T1, T2>(enu1.Current, enu2.Current);
            }

            return(result);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Fusioniert zwei <see cref="IEnumerable"/>s zu einem teilbaren Container Array
        /// </summary>
        /// <typeparam name="T1">Typ1</typeparam>
        /// <typeparam name="T2">Typ2</typeparam>
        /// <param name="e1">Das erweiterte Objekt</param>
        /// <param name="e2">Das zweite <see cref="IEnumerable"/></param>
        /// <returns>Einen teilbaren Container Array</returns>
        ///<exception cref="IndexOutOfRangeException">Wenn die Enumerationen unterschiedlich lang sind</exception>
        ///        /// <example>
        /// <para>
        /// Mit der Bindung zweier Objekte kann man z.B. Änderungen von Positionen in Collections an beiden Objekten gleichzeitig durchführen,
        /// ohne einen eigenen Algorithmus zu schreiben. Hier wird ein <see cref="string"/>-<see cref="Array"/> von mit Zahl-Representationen anhand ihrer
        /// Zahl-Equivalente sortiert (der <see cref="int"/>-<see cref="Array"/>)
        /// </para>
        /// <code>
        /// string[]    aa = new string[]   { "eins", "drei", "zwei", "minus vier" };
        /// int[]       bb = new int[]      { 1,      3,      2,      -4           };
        ///
        /// aa.Fuse(bb).OrderBy(i => i.Item2).DeFuse(out aa, out bb);
        /// //aa: { "minus vier", "eins", "zwei", "drei" }
        /// //bb: { -4, 1, 2, 3 }
        /// </code>
        /// </example>
        public static FusionTuple <T1, T2>[] Fuse <T1, T2>(this IEnumerable <T1> e1, IEnumerable <T2> e2)
        {
            int e1Count = e1.Count();

            if (e1Count != e2.Count())
            {
                throw new IndexOutOfRangeException("uneven enumeration-counts");
            }

            int counter = 0;

            FusionTuple <T1, T2>[] result = new FusionTuple <T1, T2> [e1Count];
            IEnumerator <T1>       enu1   = e1.GetEnumerator();
            IEnumerator <T2>       enu2   = e2.GetEnumerator();

            while (enu1.MoveNext() && enu2.MoveNext())
            {
                result[counter++] = new FusionTuple <T1, T2>(enu1.Current, enu2.Current);
            }

            return(result);
        }