public static IEnumerable <TResult> GroupJoin <TKey, TSource, TInner, TResult>(this IndexDefinition <TSource> source,
                                                                                       IEnumerable <TInner> inner, Func <TInner, TKey> innerKeySelector,
                                                                                       Expression <Func <TSource, TKey> > outerKeySelector,
                                                                                       Func <TSource, IEnumerable <TInner>, TResult> resultSelector,
                                                                                       IEqualityComparer <TKey> equalityComparer)
        {
            Dictionary <TKey, Tuple <TSource, List <TInner> > > dictionary = new Dictionary <TKey, Tuple <TSource, List <TInner> > >();

            foreach (TInner innerItem in inner)
            {
                TKey key   = innerKeySelector(innerItem);
                var  value = IndexFinder.FindInIndex(source, outerKeySelector, key, equalityComparer);
                if (value != null)
                {
                    if (dictionary.ContainsKey(key))
                    {
                        Tuple <TSource, List <TInner> > tuple = dictionary[key];
                        tuple.Item2.Add(innerItem);
                    }
                    else
                    {
                        List <TInner> list = new List <TInner>();
                        list.Add(innerItem);
                        dictionary.Add(key, new Tuple <TSource, List <TInner> >(value, list));
                    }
                }
            }
            foreach (KeyValuePair <TKey, Tuple <TSource, List <TInner> > > key in dictionary)
            {
                yield return(resultSelector(key.Value.Item1, key.Value.Item2));
            }
        }
        public void IndexFinder_StringArray_Index()
        {
            string[] array    = new string[] { "45", "top", "dfr", "pop", "seq" };
            string   key      = "dfr";
            int      actual   = IndexFinder.BinarySearch <string>(array, key, null);
            int      expected = 2;

            Assert.AreEqual(actual, expected);
        }
        public void IndexFinder_IntArray_Index()
        {
            int[] array    = new int[] { -9, 6, 45, 78, 495687 };
            int   key      = 78;
            int   actual   = IndexFinder.BinarySearch <int>(array, key, null);
            int   expected = 3;

            Assert.AreEqual(actual, expected);
        }
 public static IEnumerable <TResult> Join <TKey, TSource, TInner, TResult>(this IndexDefinition <TSource> source,
                                                                           IEnumerable <TInner> inner, Func <TInner, TKey> innerKeySelector,
                                                                           Expression <Func <TSource, TKey> > outerKeySelector,
                                                                           Func <TSource, TInner, TResult> resultSelector)
 {
     foreach (TInner innerItem in inner)
     {
         TKey key   = innerKeySelector(innerItem);
         var  value = IndexFinder.FindInIndex(source, outerKeySelector, key, null);
         if (value != null)
         {
             yield return(resultSelector(value, innerItem));
         }
     }
 }
 public void IndexFinder_UnsortedArray_ThrowArgumentException()
 {
     Assert.Throws <ArgumentException>(() => IndexFinder.BinarySearch <int>(new int[] { 5, 67, -5, 123 }, 0, null));
 }
 public void IndexFinder_InvalidKey_ThrowArgumentException()
 {
     Assert.Throws <ArgumentException>(() => IndexFinder.BinarySearch <int>(new int[] { 5, 67, 65, 123 }, 0, null));
 }
 public void IndexFinder_ArrayIsNull_ThrowArgumentNullException()
 {
     Assert.Throws <ArgumentNullException>(() => IndexFinder.BinarySearch <int>(null, 5, null));
 }
 public void IndexFinder_EmptyArray_ThrowArgumentException()
 {
     Assert.Throws <ArgumentException>(() => IndexFinder.BinarySearch <int>(new int[] { }, 5, null));
 }