クラスまたは構造体にインデクサを定義すると、a[i]のように、配列同様に、「インデックス」によるアクセスが可能になります。
同じクラスに複数のインデクサを定義することも可能です。その場合は、メソッドのオーバーロードと同様に、パラメータのシグネチャを別々にする必要があります。パラメータの型が同じで、「インデクサの型」だけが異なるインデクサを定義することはできません。
using System;
using System.Collections.Generic;
using System.Text;
namespace Gushwell.Sample {
public class Book {
public string Name { get; set; }
public string Author { get; set; }
public string Publisher { get; set; }
public string ISBN { get; set; }
public Book(string name, string author,
string publisher, string isbn) {
this.Name = name;
this.Author = author;
this.Publisher = publisher;
this.ISBN = isbn;
}
}
public class BookList {
private List<Book> books = new List<Book>();
public void Add(Book book){
books.Add (book);
}
// インデクサの定義
public Book this[int index]{
get {
return books [index];
}
}
public Book this[string ISBN]{
get {
foreach (Book b in books)
if (b.ISBN == ISBN)
return b;
return null;
}
}
}
class Program {
static void Main(string[] args){
BookList books = new BookList ();
books.Add(new Book("こころ", "夏目漱石",
"新潮社", "978-4101010137"));
books.Add (new Book ("人間失格", "太宰治", "角川書店", "978-4041099124"));
Book book1 = books [0];
Console.WriteLine (book1.Name);
Book book2 = books ["978-4041099124"];
Console.WriteLine (book2.Name);
Console.ReadLine ();
}
}
}