.NET開発者のためのブログメディア

【C#入門】C#のインデクサー(indexer)を使ってプログラミングをする
2020年04月09日
C#では、オブジェクトを配列のように扱う方法としてインデクサーというものがあります。呼び出し方や実装の仕方が通常のコードの書き方と多少異なっており、プロパティと似たような扱い方が可能です。インデクサーを使いこなすことで、コードを簡潔に記述することができます。
- PG
- インデクサーってなんかカッコ良さようだけど、どうやって使うんですか?
- PM
- プロパティと挙動は似ていますね。使いこなせれば見やすいコードにすることができますよ。さっそく見ていきましょう。
目次
C#におけるインデクサーの概要
C#におけるインデクサーは、あたかも配列であるかのように呼び出せる機能で、あらかじめユーザーが定義したコードを実行させることができます。クラス名などの名前を定義する必要がないため、コーディングに慣れていれば一目でインデクサーだと分かるでしょう。インデクサーの中で定義するgetは要素型のデータを返す必要があり、setでは要素型の引数を受け取ることになります。
インデクサーを使ったC#のプログラム
インデクサーは配列と似ていますが、中身は別物になっています。最大の特徴はアクセスする際の添え字がint型である必要がないことで、対応したデータを入れるようにすれば文字列でも添え字にすることが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; class DemoIndexer { private string [] testList = { "最初", "真ん中", "最後" }; public string this[int index] { get { return testList[index]; } } } class IndexerTest { static void Main() { DemoIndexer ind = new DemoIndexer(); Console.WriteLine( ind[2] ); } } |
実行結果
1 |
最後 |
このコードでは、インデクサーで定義した文字配列の中身にアクセスして表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
using System; internal class Item { public string key; public string value; public Item next; public Item(string key, string value, Item next) { this.key = key; this.value = value; this.next = next; } } public class Dic { Item head; public Dic() { this.head = new Item(null, null, null); } public string this[string key] { set { for(Item item = this.head.next; item != null; item =item.next) { if(item.key == key) { item.value = value; return; } } this.head.next = new Item(key, value, this.head.next); } get { for(Item item = this.head.next; item != null; item =item.next) { if(item.key == key) { return item.value; } } return null; } } } class IndexerTest { static void Main() { Dic dic = new Dic(); // 辞書引きするキーワード string search_str = "かぼちゃ"; dic["大根"] = "だいこん"; dic["だいこん"] = "大根"; dic["人参"] = "にんじん"; dic["にんじん"] = "人参"; dic["茄子"] = "なす"; dic["なす"] = "茄子"; dic["南瓜"] = "かぼちゃ"; dic["かぼちゃ"] = "南瓜"; if(dic[search_str] == null) { Console.Write("登録されていません。"); } else { Console.Write(dic[search_str]); } } } |
実行結果
1 |
南瓜 |
このコードでは、あらかじめインデクサーに登録したキーワードを検索し、対応するインデックスに対応した文字列を返します。インデクサーのインデックスに文字列が適用できることを利用しています。
- PG
- ちょっと難しそうですが、見た感じはすごく便利そうに見えます!
- PM
- そうですね。うまく使いこなせれば、凝った使い方もできますよ。
インデクサーの性質や使いどころを熟知する
インデクサーを上手く使った例として挙げられるのは、添え字に文字列を使えることを活かした簡単な辞書クラスでしょう。この使い方はインデクサーならではのもので、1対1の変換をしたい場合に特に威力を発揮します。また、コードを整理する上でも一役買う場面もあるため、C#でのコーディングをする際には意識しておきたいところです。