.NET 4.x Сравнение коллекций и последующая модификация - C#
Формулировка задачи:
Есть 2 коллекции Из второй коллекции удалили один айтем, как синхронизировать 2 коллекции? Т.е. и в первой удалить этот айтем?
ObservableCollection<CollectionItem> CollectionOne и ObservableCollection<CollectionItem> CollectionTwo содержащие по 5 айтемов.
public class CollectionItem()
{
public string Name {get;set;}
public object SomeData {get;set;}
}Решение задачи: «.NET 4.x Сравнение коллекций и последующая модификация»
textual
Листинг программы
static class LinqExtensions
{
public static IEnumerable<TResult> FullOuterJoin<TOuter, TInner, TKey, TResult>(
this IEnumerable<TOuter> outer, // "Левая" коллекция
IEnumerable<TInner> inner, // "Правая" коллекция
Func<TOuter, TKey> outerKeySelector, // Делегат для выбора ключа "левых" элементов
Func<TInner, TKey> innerKeySelector, // Делегат для выбора ключа "правых" элементов
Func<TKey, TOuter, TInner, TResult> resultSelector, // Делегат для выбора результата
IEqualityComparer<TKey> keyComparer = null, // Опциональный comparer для ключа (например, StringComparer.InvariantCultureIgnoreCase для сравнения строк без учета регистра)
TOuter defaultOuter = default(TOuter), // Значение "левого" элемента, если таковой не найден
TInner defaultInner = default(TInner)) // Значение "правого" элемента, если таковой не найден
{
keyComparer = keyComparer ?? EqualityComparer<TKey>.Default;
var left = outer.ToLookup(outerKeySelector, keyComparer);
var right = inner.ToLookup(innerKeySelector, keyComparer);
var distinct = new HashSet<TKey>(from entry in left select entry.Key);
distinct.UnionWith(from entry in right select entry.Key);
return from key in distinct
from a in left[key].DefaultIfEmpty(defaultOuter)
from b in right[key].DefaultIfEmpty(defaultInner)
select resultSelector(key, a, b);
}
}