Возвращает различия между двумя перечисляемыми

#c# #collections #enumerable

#c# #Коллекции #перечисляемый

Вопрос:

Я пытаюсь определить различия между двумя коллекциями.

 private ObservableCollection<SomeObject> _objectList = null;
private ObservableCollection<SomeObject> _cachedObjectList = null;
  

SomeObject реализует IEquatable<SomeObject>

Я использую следующее, чтобы определить, есть ли у моих двух коллекций какие-либо различия:

 this._objectList.ToList().OrderBy(x => x.Id).SequenceEqual(this._cachedObjectList.ToList().OrderBy(x => x.Id));
  
  • Коллекция _cachedObjectList не изменится.
  • Вы можете добавлять, удалять или изменять объект в коллекции _objectList .

Как я могу вернуть новый список, содержащий любой недавно добавленный, удаленный или иным образом измененный объект из двух коллекций.

Любая помощь будет принята с благодарностью!

Подходящая реализация для SomeObject:

 public class SomeObject : IEquatable<SomeObject>
{
        public int GetHashCode(SomeObject object)
        {
            return base.GetHashCode();
        }

        public bool Equals(SomeObject other)
        {
            bool result = true;


            if (Object.ReferenceEquals(other, null))
            {
                result = false;
            }

            //Check whether the compared objects reference the same data.
            if (Object.ReferenceEquals(this, other))
            {
                result = true;
            }
            else
            {
                // if the reference isn't the same, we can check the properties for equality
                if (!this.Id.Equals(other.Id))
                {
                    result = false;
                }

                if (!this.OtherList.OrderBy(x => x.Id).ToList().SequenceEqual(other.OtherList.OrderBy(x => x.Id).ToList()))
                {
                    result = false;
                }
            }

            return resu<
        }
    }
}
  

Редактировать:
Я хочу изменения только в том случае, если _objectList содержит измененный объект, основанный на IEquatable .Equals() тогда я бы хотел, чтобы он был возвращен. В противном случае верните новые объекты или удаленные объекты в списке.

Комментарии:

1. Содержат ли ваши коллекции повторяющиеся элементы? Если коллекция A имеет два «a», а коллекция B имеет один «a», вывод A — B будет одним «a» или вообще без «a»?

2. @MiguelAngelo, нет, повторяющихся элементов нет.

Ответ №1:

Вы бы нашли различия с

 var newAndChanged = _objectList.Except(_cachedObjectList);
var removedAndChanged = _cachedObjectList.Except(_objectList);
var changed = newAndChanged.Concat(removedAndChanged);
  

Комментарии:

1. Ответ хороший, единственное, что я бы добавил, это убедиться, что тип объекта, который содержит список, реализует IEquatable(Of T) . Это, конечно, предполагает, что это пользовательский тип. Смотрите следующую ссылку .

2. По какой-то причине IEquatable Equals никогда не достигается, есть идеи?

3. @Michael: Вы можете сделать много неправильных вещей при реализации IEquatable.

4. В этом случае Concat лучше, чем Union, первый — O (n), второй — не менее O (n log n).

5. @MichaelG просто забудьте об IEquatable и создайте отдельный класс, который реализует IEqualityComparer(Of T) , Except для этого требуется перегрузка.