我有两个不同类型的集合,TSource
分别TTarget
是。
TTarget
集合将使用在集合中找到的项目进行更新,TSource
但由于这些更改包括工作流触发器,我必须知道添加、更新和删除的内容。
Func<TSource, TTarget, bool> Equals
假设一个函数,在这些集合上运行差异的最快方法是什么?此相等函数通常会比较两个对象之间的一个关键字段,但并非总是如此。
我能找到的唯一解决方案是明确说明它们的关键是什么(即不要将其隐藏在内部Equals()
并使用Intersect
and HashSet
:
void Main()
{
string[] target = new[] { "1", "2", "3", "4" }; // collection that will be updated
int[] source = new[] { 0, 1, 2 }; // collection with the items for comparison and update
// I've used simple types to reduce complexity
Func<string, string> targetKeyFunc = t => t;
Func<int, string> sourceKeyFunc = s => s.ToString();
HashSet<string> keySet = new HashSet<string>(
source.Select(sourceKeyFunc).Intersect(target.Select(targetKeyFunc)));
foreach(var it in source)
if(keySet.Contains(sourceKeyFunc(it)))
Console.WriteLine("Updated: {0}", it);
else
Console.WriteLine("Added: {0}", it);
foreach(var it in target)
if(!keySet.Contains(targetKeyFunc(it)))
Console.WriteLine("Removed: {0}", it);
}
这是一个很好的实现,但将我绑定到使用键选择器。是否有更快或尽可能快的替代方案允许使用Equals()
如上所述的函数?