2

我想以这种方式将集合(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 的两个实体的其他数据可能不同)。更新的代码示例。

4

2 回答 2

2

编辑

如果你只是想缩短它,试试这个。

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

如果我正确阅读了您的要求,您可以将其总结为

“C1 应该等于内容 C2。”

例如

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

所以

  • 删除“1”,因为它不在 C2 中
  • 留下'2'和'3'现在因为他们在C2
  • 添加“4”,因为它存在于 C2 中

因此,您要做的就是将 C1 替换为 C2 内容的副本。

public static void Synchronize<T>(this ICollection<T> first, ICollection<T> second)
{
    first.Clear();
    foreach(var s in second) { first.Add(s); }
}
于 2013-05-22T12:37:24.207 回答
-1

事实上,你想first成为second你的算法所做的事情。

因此,您可以像这样以更优雅的方式做到这一点:

first = second.ToList();
于 2013-05-22T12:42:07.103 回答