/// <summary> /// Vrátí pole prvků, které nejsou v this kolekci a jsou jen v dodané kolekci <paramref name="newItems"/>. /// Pro určení shody používá klíč, který z prvku získá dodaný <paramref name="keySelector"/>. /// Mějme kolekci this obsahující záznamy { 1,2,3,4,5 } a kolekci <paramref name="newItems"/> obsahující záznamy { 4,5,6,7 }, pak výsledek bude kolekce { 6,7 } /// = tedy to, co je v kolekci <paramref name="newItems"/> navíc nad rámec this. /// Vrácená kolekce obsahuje prvky ze seznamu newItems. /// Kolekce <paramref name="newItems"/> nesmí být null. /// </summary> /// <typeparam name="TKey"></typeparam> /// <typeparam name="TValue"></typeparam> /// <param name="items"></param> /// <param name="keySelector"></param> /// <param name="newItems"></param> /// <returns></returns> public static TValue[] SyncOnlyNew <TKey, TValue>(this IEnumerable <TValue> items, Func <TValue, TKey> keySelector, IEnumerable <TValue> newItems) { SynchronizedPair <TKey, TValue>[] syncItems = SynchronizedPair <TKey, TValue> .CreateSynchron(keySelector, items, newItems); return(syncItems .Where(i => i.ItemOnSide == SynchronizedSide.Right) .Select(i => i.ItemRight) .ToArray()); }
/// <summary> /// Vrátí pole prvků, které jsou pouze v jedné z kolekcí (v this anebo v dodané kolekci <paramref name="newItems"/>), tedy vrátí rozdíly. /// Pro určení shody používá klíč, který z prvku získá dodaný <paramref name="keySelector"/>. /// Mějme kolekci this obsahující záznamy { 1,2,3,4,5 } a kolekci <paramref name="newItems"/> obsahující záznamy { 4,5,6,7 }, pak výsledek bude kolekce { 4,5 } /// = tedy to, co je v kolekci this a přitom je v <paramref name="newItems"/>. /// Vrácená kolekce obsahuje prvky ze seznamu this. /// Kolekce <paramref name="newItems"/> smí být null, pak se vrací vstupní kolekce (this) jako new Array. /// </summary> /// <typeparam name="TKey"></typeparam> /// <typeparam name="TValue"></typeparam> /// <param name="items"></param> /// <param name="keySelector"></param> /// <param name="newItems"></param> /// <returns></returns> public static TValue[] SyncDifferent <TKey, TValue>(this IEnumerable <TValue> items, Func <TValue, TKey> keySelector, IEnumerable <TValue> newItems) { if (newItems == null) { return(items.ToArray()); } SynchronizedPair <TKey, TValue>[] syncItems = SynchronizedPair <TKey, TValue> .CreateSynchron(keySelector, items, newItems); return(syncItems .Where(i => (i.ItemOnSide == SynchronizedSide.Left || i.ItemOnSide == SynchronizedSide.Right)) .Select(i => (i.ItemOnSide == SynchronizedSide.Left ? i.ItemLeft : i.ItemRight)) .ToArray()); }