Мне часто приходится проектировать одну коллекцию в другую. Это было бы очень легко с помощью оператора Select от linq к объектам:проецируйте одну коллекцию в другую и держите их в синхронизации
var targetCollection = sourceCollection.Select(source => new Target
{
Source = source,
//some other stuff here
}
Но мне нужно сохранить коллекции в конечном итоге синхронизированными. Когда новые элементы добавляются или удаляются из sourceCollection, изменения должны отражаться в targetCollection. Я должен сделать что-то вроде этого:
void OnSourceCollectionChanged(){
SyncCollections(sourceCollection, targetCollection)
}
void SyncCollections(ICollection<Source> sourceCollection, ICollection<Target> targetCollection)
{
//find items that are no longer present
var newItems = sourceCollection.Where(s => !targetCollection.Any(t => t.Source == s));
//find items that were added
var oldItems = targetCollection.Where(t => !sourceCollection.Any(s => t.Source == s));
foreach(var oldItem in oldItems) targetCollection.Remove(oldItem);
foreach(var source in newItems){
var target = new Target{ Source = source };
targetCollection.Add(target);
}
}
Я считаю, что уже есть хорошие библиотеки для решения таких сценариев. Вы можете мне порекомендовать?
Я думаю API, где я просто указать проекцию и, возможно, «равенство компаратор» для сравнения исходного и целевого элемента:
var synchronizer = new CollectionSynchronizer<Source, Target>(
source => new Target
{
Source = source
});
synchronizer.Sync(sourceCollection, targetCollection);
//or specify filter as well:
synchronizer.Sync(
sourceCollection.Where(s => s.Created > DatTime.Now.AddMinutes(-5)),
targetCollection);
Это далеко не то, что мне нужно, @venerik;) – Liero