1) Обратите внимание, что Person
, скорее всего, не тип значения, но ссылочный тип. Поэтому Except
не будет сравнивать значения, а скорее ссылки. Если вы хотите применить «кроме» логики свойство экземпляров (скажем, «Name»), а затем использовать что-то вроде этого:
string[] valuesToExclude = list1.Select(person => person.Name).ToArray();
var newList = list2.Where(person => !valuesToExclude.Contains(person.Name)).ToList();
2) в качестве альтернативы Вы можете передать IEqualityComparer<Person>
в Except
:
public class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return Equals(x.Name, y.Name);
}
public int GetHashCode(Person obj)
{
return obj.Name.GetHashCode();
}
}
это второй параметр, как:
var newList = list2.Except(list1, new PersonComparer()).ToList();
3) И, наконец, стоит отметить, что если Person
были в struct
(тип значения), тогда ваш код будет работать как есть, , предполагая, что все свойства соответствуют выбранным вами экземплярам. Например:
public struct Person
{
public string Name { get; set; }
}
List<Person> list1 = new List<Person>
{
new Person { Name = "A" },
new Person { Name = "B" },
};
List<Person> list2 = new List<Person>
{
new Person { Name = "A" },
};
var newList = list1.Except(list2).ToList();
// "B" only
Что не работает? – StriplingWarrior
Да, это должно работать, если вы используете пространство имен System.Linq – RebelFist