我希望以这种方式将集合(C1)的内容与另一个集合(C2)同步:
同步后C1中的项目顺序无关紧要。
我写的实现看起来像这样:
public static void Synchronize<T>(this ICollection<T> first, ICollection<T> second, IEqualityComparer<T> comparer)
{
// delete items, which present in first, but absent in second
foreach (var item in first.Except(second, comparer).ToArray())
{
first.Remove(item);
}
// add items, which present in second, but absent in first
foreach (var item in second.Except(first, comparer).ToArray())
{
first.Add(item);
}
}
我想知道,有更优雅或标准的方式吗?
更新
抱歉,有些澄清。
C1不一定是C2的副本,因为T
将是从数据库加载的某个实体,我将按标识符测试相等性(具有相同id的两个实体的其他数据可能不同) )。更新了代码示例。
答案 0 :(得分:2)
修改强>
如果您只想缩短它,请尝试此操作。
first.Intersect(second, comparer).Union(second, comparer); //Will return an IEnumerable<T>
如果我正确地阅读了您的要求,您可以将其概括为
&#34; C1应该等于内容C2。&#34;
e.g。
所以
所以你要做的就是用C2的内容副本替换C1。
public static void Synchronize<T>(this ICollection<T> first, ICollection<T> second)
{
first.Clear();
foreach(var s in second) { first.Add(s); }
}
答案 1 :(得分:-1)
事实上,您希望first
成为second
,这是您的算法所做的。
所以你可以用这样更优雅的方式做到这一点:
first = second.ToList();