1

我有一个保存更改列表的网页,因此在保存操作中我有两个列表,一个包含新值,一个包含现有值。

我想要:

  • 循环遍历两个列表,合并和重复数据删除。
  • 我想在新列表而不是现有列表中的哪个位置添加新项目。
  • 我想在两个列表中的哪个位置跳过它。
  • 我想在现有列表中但不在新列表中的位置删除该项目。

很容易找到一种方法来做到这一点,例如:

public static IEnumerable<UnionCompared<T>> UnionCompare<T>(
    this IEnumerable<T> first, IEnumerable<T> compare, IEqualityComparer<T> comparer = null)
{
    // Create hash sets to check which collection the element is in
    var f = new HashSet<T>(first, comparer);
    var s = new HashSet<T>(compare, comparer);

    // Use Union as it dedupes
    var combined = first.Union(compare, comparer);
    foreach (var c in combined)
    {
        // Create a type that has the item and a flag for which collection it's in
        var retval = new UnionCompared<T>
        {
            Item = c,
            InFirst = f.Contains(c),
            InCompare = s.Contains(c)
        };

        yield return retval;
    }
}

然而,这更像是重新发明轮子。有什么东西已经这样做了吗?这似乎是其他人已经解决的问题。

有没有更好的办法?

4

1 回答 1

1

如果您的类型 T 具有唯一键(字符串或 id),那么我建议提取所有键,将它们放在字符串int类型的列表中,并使用相交和除外扩展方法来获取重复项/缺失项/新项或写入一个IEqualityComprer -实现您的自定义类型T并再次使用List扩展方法。

最后,我认为此解决方案将使用与您的实现或多或少相同数量的代码。我总是尝试使用框架已经提供的东西。:-)

于 2013-05-20T16:07:05.043 回答