Есть несколько способов справиться с этим.
Один из способов, как написал Дэвид Грилач в своем ответе (теперь удален, но Руфус Л добавил еще один ответ, показывающий, как это сделать), - переопределить метод Equals
- но я бы не рекомендовал этого, если вы действительно не знаете, что делаете , При переопределении метода Equals
рекомендуется также переопределить метод GetHashCode
- и это легко сделать неправильно.
Другой способ - изменить Contains
на Find
- , что, вероятно, будет самым простым способом сделать это:
if (OnlineUsersBooks.Find(b=> b.ISBN == y.ISBN)==null)
Использование метода Find
позволяет использовать лямбда-выражение в качестве предиката, поэтому вам не нужно переопределять Equals
или GetHashCode
.
Еще один способ - использовать linq. Он очень мощный и не так сложен в освоении, и может помочь вам написать гораздо меньше кода, чем вы делаете сейчас.
Вот непроверенный пример того, как я мог бы получить книги, которые нужно вставить в базу данных с помощью linq:
var booksToAdd = NewBooks
.Where(nb => !OnlineUsersBooks
.Any(ob => ob.ISBN == nb.ISBN));
Он вернет IEnumerable<Book>
, который содержит все книги в NewBooks
, у которого нет соответствия ISBN в OnlineUsersBooks
, без необходимости писать цикл для его получения.
Еще одним преимуществом этого подхода является то, что он устраняет необходимость в if(OblineUsersBooks.Count>0)
- он будет работать так же с пустым списком.
Кроме того, как примечание, вы не должны использовать открытые поля. Вместо этого используйте общедоступные свойства ( Бонусное чтение: почему? ):
public class Book
{
public string Title {get; set;} // Note the {get;set;} here.
public string Author {get; set;}
public string ISBN {get; set;}
public Book(string title, string author, string iSBN)
{
Title = title;
Author = author;
ISBN = iSBN;
}
}