将集合的内容与另一个集合同步

时间:2013-05-22 12:17:32

标签: c#

我希望以这种方式将集合(C1)的内容与另一个集合(C2)同步:

  • 如果特定项目出现在C1中,并且在C2中出现,则必须从C1中删除;
  • 如果特定项目出现在C2中,并且在C1中出现,则必须将其添加到C1;
  • 如果特定项目同时出现在C1和C2中,则必须留在C1中。

同步后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的两个实体的其他数据可能不同) )。更新了代码示例。

2 个答案:

答案 0 :(得分:2)

修改

如果您只想缩短它,请尝试此操作。

first.Intersect(second, comparer).Union(second, comparer); //Will return an IEnumerable<T>

如果我正确地阅读了您的要求,您可以将其概括为

&#34; C1应该等于内容C2。&#34;

e.g。

  • C1包含1,2,3
  • C2包含2,3,4

所以

  • 删除&#39; 1&#39;因为它不在C2
  • 离开&#39; 2&#39; &安培; &#39; 3&#39;目前他们在C2
  • 添加&#39; 4&#39;因为它存在于C2

所以你要做的就是用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();