3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【読書ノート】《C# in Depth》~3

Last updated at Posted at 2017-04-19

日本語で投稿してくださいって言われましたので、ここから日本語で書きましょう。:frowning2:

ジェネリックの誕生:ocean:
何故ジェネリックが存在するのか?知りたいでしょう!?

要求: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の書き方を見てみましょう、ジェネリックを使うと上記の問題をクリアする事が出来ます。:point_up_tone4:

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);
}

:kissing_heart: :kissing_heart: :kissing_heart: :kissing_heart:すすすすごいでしょう。Write Less Do More !!!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?