日本語で投稿してくださいって言われましたので、ここから日本語で書きましょう。
ジェネリックの誕生
何故ジェネリックが存在するのか?知りたいでしょう!?
要求:ArrayListをソーティングする
C#1の書き方を見てみましょう(非ジェネリック)
class ProductNameComparer : IComparer
{
public int Compare(object x, object y)
{
Product first = (Product)x;
Product second = (Product)y;
return first.name.CompareTo(second.Name);
}
}
ArrayList products = Product.GetSampleProducts();
products.Sort(new ProductNameComparer ());
foreach (Product product in products)
{
Console.WriteLine(product);
}
若し、GetSampleProductの戻り値はstringの場合、エラーが発生してしまう。原因はstringをProduct型に強制変換しようとする。
C#2の書き方を見てみましょう、ジェネリックを使うと上記の問題をクリアする事が出来ます。
class ProductNameComparer : IComparer<Product>
{
public int Compare(Product x, Product y)
{
return x.Name.CompareTo(y.Name);
}
List<Product> products = Product.GetSampleProducts();
products.Sort(new ProductNameComparer());
foreach (Product product in products)
{
Console.WriteLine(product);
}
}
ソースが少なくなりました、嬉しいでしょう! そして、最初に渡されたパラメーターはProduct型です、強制変換しなくでもいい。
確かにC#2はC#1より良くなりました、でも、私は直接に商品(Product)をソーティングしたいですが、インタフェースを使わずに実現できるかな?
答えは出来ます、デリゲートを使えば実現出来ます。
List<Product> products = Product.GetSampleProducts();
products.Sort(delegate(Product x, Product y))
{ return x.Name.CompareTo(y.Name);}
);
foreach (Product product in products)
{
Console.WriteLine(product);
}
OK,いい感じでしょう? 次はC#3のソースを見てみましょう
List<Product> products = Product.GetSampleProducts();
products.Sort(x,y) => x.Name.CompareTo(y.Name));
foreach(Product product in products)
{
Console.WriteLine(product);
}
=> は伝説のLambda式(ラムダ式) delegateを省略された。
C#3はそれだけじゃなく、OrderByを使ってソーティングする
List<Product> products = Product.GetSampleProducts();
foreach(Product product in products.OrderBy(p => p.Name))
{
Console.WriteLine(product);
}
すすすすごいでしょう。Write Less Do More !!!