2017-12-07 14 views
2

オブジェクトのリスト内の特定のプロパティを検証して一意であることを確認するユースケースがあります。基本的な設定は下のコードで見ることができます。リスト内の.Addメソッドのオーバーライド

class Program { 
    static void Main(string[] args) { 

     Directory myDirectory = new Directory("Interaction Design"); 
     myDirectory.Books.Add(new Book("978-0-262-64037-4", "The Design of Everyday Things")); //Should be added 
     myDirectory.Books.Add(new Book("978-0-262-13474-3", "Designing Interactions")); //Should be added 
     myDirectory.Books.Add(new Book("978-0-262-13474-3", "Whoops, I slipped up")); //Should NOT be added 

    } 
} 

public class Directory { 
    public Directory(string name) { 
     Name = name; 
    } 
    public string Name { get; set; } 
    public List<Book> Books { get; set; } = new List<Book>(); 
} 

public class Book { 
    public Book(string isbn, string title) { 
     Isbn = isbn; 
     Title = title; 
    } 
    public string Title { get; set; } 
    public string Isbn { get; set; } 
} 

ここで、ISBN番号が一意でない場合は、List of Booksに新しいブックを追加すると例外がスローされます。

リストの.Addメソッドを拡張し、その検証を追加したいと思いますが、実際にどのように行うかはわかりません。

私は似たようなことを見ましたが、DirectoryはListから継承していて、この場合は有効な解決策のようには見えません。

おそらく私の一般的なアプローチは後方ですか?

アドバイスをしてください。

+0

https://stackoverflow.com/q/21692193/34397 – SLaks

+0

このリンクを参照してください[どのようにリストのC#でのメソッドの追加?](https://stackoverflow.com/questions/580202/how- do-i-override-listts-add-method-in-c) –

+0

本を非公開にします。それをIEnumerableゲッターで公開し、次に検証を行い、それをプライベートリストに追加したり、削除したりするメソッドを追加して削除しますか? – Dave

答えて

3

あなたが一意たい場合は、あなたにそれを与えるコレクションを使用:を設定します。

くださいISBNの試合は、書籍の独自のリストを表しHashSet<Book>でそれを使用する場合と等しくなるように二冊の本を考慮IEqualityComparer<book>

public class Directory 
{ 

    public HashSet<Book> Books { get; } 
     = new HashSet<Book>(new BookEqualityComparer()); 
    //... 
    private class BookEqualityComparer : IEqualityComparer<Book> 
    { 
     public bool Equals(Book x, Book y) 
     { 
      if (ReferenceEquals(x, y)) 
       return true; 

      if (ReferenceEquals(x, null) || 
       ReferenceEquals(y, null)) 
       return false; 

      return x.Isbn == y.Isbn; 
     } 

     public int GetHashCode(Book obj) 
      => obj.Isbn.GetHashCode(); 
    } 
} 

そして、あなたは、あなたが「できる行われBooksに重複する本があります。

+0

それは問題を治療する本当に素晴らしい方法でした。それは稼働しています。ありがとう。 –

0

1つのオプションは、新しいクラスを作成し、上書きする可能性がList<T>、のではなく、Collection<T>を継承することですInsertItem

例えば次の呼び出しで呼び出さ

public class MyList: Collection<string> 
{ 

    protected override void InsertItem(int index, string newItem) 
    { 
     DoValidation(); 
    } 

} 

var myList = new MyList(); 
myList.Add("item1"); 
+0

これは最も実践的な解決策であり、本のプロパティを独自のクラスに分割して操作しているようです。私はそれを避けることを望んでいましたが、それが私の最高の賭けであれば... –

0

なぜ、この?

public class Directory 
{ 
    private List<Book> _books; 

    public IEnumerable<Book> Books 
    { 
     { 
      return _books; 
     } 
    } 

    Public void AddBook(Book book) 
    { 
     //Validate 
     if(valid) 
     { 
      _books.Add(book); 
     } 
    } 
    //Etc 
} 
関連する問題