はじめに
最近はコレクションを処理するのに、LINQばかり使っているので、Arrayのメソッドを呼び出すことはあまりないのだけれど、稀にArrayのメソッドを呼び出したい時があります。
でも、
var items = new[] { 5, 3, 7, 9, 1, 4 };
Array.ForEach(items, Console.WriteLine);
て書くのはなんかイヤです。やっぱり、
var items = new[] { 5, 3, 7, 9, 1, 4 };
items.ForEach(Console.WriteLine);
って書きたいです。
拡張メソッドを定義しよう
そんな時は拡張メソッドの出番です。以下の様な拡張メソッドを定義することで、ArrayのメソッドもList<T>と同じ様な感覚でコードを書くことができます。
public static class ArrayExtensions
{
public static void ForEach<T>(this T[] array, Action<T> action)
{
Array.ForEach(array, action);
}
public static void Sort<T>(this T[] array) where T : IComparable<T>
{
Array.Sort(array);
}
}
ArrayExtensionsが定義されている名前空間をusingすれば、以下の様な記述が可能になります。
var items = new[] { 5, 3, 7, 9, 1, 4 };
items.Sort();
items.ForEach(Console.WriteLine);
結果は以下の通り。
1
3
4
5
7
9
IndexOfやFindAllなどのメソッドも同様に拡張メソッドにすれば使い勝手もよくなります。
おわりに
まあ、LINQあるのでこういった拡張メソッドを書く必要性もあまり無いんですけどね。
昔書いたブログ記事を読み直していて、拡張メソッドで遊んでいたことを懐かしく思い出したので、こんな記事を書いてみました。