Как найти не совпадающие записи в общем списке на С#

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

Я хочу игнорировать совпадающую запись в первом списке.

public class CuratedIncludeUid
    {
        public string type { get; set; }
        public string uid { get; set; }
    }

List<CuratedIncludeUid> newUids = new List<CuratedIncludeUid>();
            newUids.Add(new CuratedIncludeUid { type = "series", uid = "600" });

            List<CuratedIncludeUid> liExistingUids = new List<CuratedIncludeUid>();
            liExistingUids.Add(new CuratedIncludeUid { type = "series", uid = "600" });
            liExistingUids.Add(new CuratedIncludeUid { type = "series", uid = "200" });

            var ied = liExistingUids.Except(newUids).ToList(); ;
            foreach (var row in ied)
            {
                Console.WriteLine("Uid:" + row.uid + "type:" + row.type);
            }
            Console.Read();

I am getting Output as below 
Uid:600type:series
Uid:200type:series

**My expected output as below
Uid:200type:series**

person Shakeer Hussain    schedule 10.01.2019    source источник
comment
Можете ли вы включить код для CuratedIncludeUid?   -  person CaTs    schedule 11.01.2019
comment
@CaTs Включенный код   -  person Shakeer Hussain    schedule 11.01.2019
comment
Вы сравниваете разные объекты. Вам нужно использовать пользовательский компаратор. Вы можете прочитать подробности с образцом здесь: cetinbasoz.wordpress.com/2009 /06/21/linq-query-operators---part-vi/   -  person Cetin Basoz    schedule 11.01.2019


Ответы (2)


Либо вы можете реализовать Equals и GetHashCode или IEqualityComparer, либо вы также можете сделать следующее:

С Все:

var ied = liExistingUids.Except(newUids).ToList();
liExistingUids
  .Where(x => newUids.All(y => y.type != x.type && y.series != x.series))
  .ToList();

С Любой:

liExistingUids
  .Where(x => !newUids.Any(y => y.type == x.type && y.series == x.series))
  .ToList();
person Gauravsa    schedule 10.01.2019
comment
Помогает мне с методом Any() - person Shakeer Hussain; 11.01.2019
comment
При переопределении Equals и GetHashCode крайне важно, чтобы объект был доступен только для чтения или, по крайней мере, хэш-код не менялся вместе со свойствами/полями. - person Enigmativity; 11.01.2019

Либо переопределить Equals и GetHashCode

public class CuratedIncludeUid
{
    public string type { get; set; }
    public string uid { get; set; }

    protected bool Equals(CuratedIncludeUid other)
    {
        return string.Equals(type, other.type) && string.Equals(uid, other.uid);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        return Equals((CuratedIncludeUid) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return ((type != null ? type.GetHashCode() : 0) * 397) ^ (uid != null ? uid.GetHashCode() : 0);
        }
    }
}

Или передать IEqualityComparer в Except

public class CuratedIncludeUidEqualityComparer : IEqualityComparer<CuratedIncludeUid>
{
    public bool Equals(CuratedIncludeUid x, CuratedIncludeUid y)
    {
        if (ReferenceEquals(x, y)) return true;
        if (ReferenceEquals(x, null) || ReferenceEquals(y, null)) return false;
        return string.Equals(x.type, y.type) && string.Equals(x.uid, y.uid);
    }

    public int GetHashCode(CuratedIncludeUid obj)
    {
        unchecked
        {
            return ((obj.type != null ? obj.type.GetHashCode() : 0) * 397) ^ (obj.uid != null ? obj.uid.GetHashCode() : 0);
        }
    }
}
var ied = liExistingUids.Except(newUids, new CuratedIncludeUidEqualityComparer()).ToList();
person nosale    schedule 10.01.2019
comment
При переопределении Equals и GetHashCode крайне важно, чтобы объект был доступен только для чтения или, по крайней мере, хэш-код не менялся вместе со свойствами/полями. - person Enigmativity; 11.01.2019