0

我有以下课程。为了使它可以比较,我添加了一个 Equals 方法:

 public ObjectiveDetail()
    public int ObjectiveDetailId { get; set; }
    public int Number { get; set; }
    public string Text { get; set; }
    public override bool Equals(object obj)
    {
        return this.Equals(obj as ObjectiveDetail);
    }
    public bool Equals(ObjectiveDetail other)
    {
        if (other == null)
            return false;

        return this.Number.Equals(other.Number) &&
            (
                this.Text == other.Text ||
                this.Text != null &&
                this.Text.Equals(other.Text)
            );
    }
 }

我有两个 ICollection 集合:

ICollection<ObjectiveDetail> _obj1; // Reference
ICollection<ObjectiveDetail> _obj2; // May have more, less or different objectDetails from the reference.

集合的通用 tfield 是 ObjectiveDetailId。有没有办法可以使用三个 LINQ 表达式来创建:

  • _obj2 而不是 _obj1 中的行集合
  • _obj1 而不是 _obj2 中的行集合
  • _obj1 和 _obj2 之间不同的行的集合

请注意,这类似于我之前提出的另一个问题,但我认为现在我已经添加了 Equals 方法,这有点简单。会这样做吗?

4

3 回答 3

1

您应该始终覆盖Equals and GetHashCode

  • _obj2 而不是 _obj1 中的行集合

    var inObj2NotInObj1 = _obj2.Except(_obj1).ToList();
    
  • _obj1 而不是 _obj2 中的行集合

    var inObj1NotInObj2 = _obj1.Except(_obj2).ToList();
    
  • _obj1 和 _obj2 之间不同的行的集合

指定不同的,如果你的意思不是Equals,那就是你上面的内容。

于 2013-08-10T13:45:24.443 回答
1

您可以使用Except减去集合:

var in2butNot1 = _obj2.Except(_obj1);
var in1butNot2 = _obj1.Except(_obj2);

但是,这可能不是您想要得到的,因为已经“更改”的对象将被视为彼此简单地“不相等”。

您的对象似乎有一个ID字段。您可以对该对象进行排序ID,然后像生成合并一样遍历两个集合。if这将允许您使用简单的s链检测插入、更新和删除。

您还可以使用 ID 来决定哪些是常见的,哪些是更改的:

var ids1 = new HashSet<int>(_obj1.Select(o => o.ObjectiveDetailId));
var ids2 = new HashSet<int>(_obj2.Select(o => o.ObjectiveDetailId));
var in2butNot1 = _obj2.Where(o => !ids1.Contains(o.ObjectiveDetailId));
var in1butNot2 = _obj1.Where(o => !ids2.Contains(o.ObjectiveDetailId));
于 2013-08-10T13:45:42.627 回答
1

我不等于的意思是当对象具有相同的 ObjectiveDetailId 但不同的“数字”或“文本”字段值时。

如果您创建一个将 ID 映射到原始 (_obj1) 对象的字典,则可以为每个新 (_obj2) 对象查找具有匹配 ID 的原始对象并进行比较:

var oldDictionary = _obj1.ToDictionary(old => old.ObjectiveDetailId);
var updated = _obj2.Where(current => {
    ObjectiveDetail old = null;
    var isExisting = oldDictionary.TryGetValue(current.ObjectiveDetailId, out old);
    return isExisting && !old.Equals(current);
});
于 2013-08-10T14:16:47.017 回答