On Github masakura / extension-method-slide
政倉 智
2016/01/23 (土)
[かごべん] LINQ とか勉強会
本日お話することはこちら!
// 拡張メソッドを宣言する
public static class StringExtension
{
    public static int ToInt32(this String s)
    //                        ~~~~ this とつけるだけ
    {
        return Int32.Parse(s);
    }
}
// スタティックメソッドなのに、インスタンスメソッドのように呼び出せる! int i = "123".ToInt32();
やみくもに使うことは避けましょう!
// IEnumerable<Customer> 型用の拡張メソッド
public static class CustomerExtension
{
    // 男性だけの集合を返す
    public IEnumerable<Customer> Males(this IEnumerable<Customer> customers)
    {
        return customers.Where(c => c.Sex == Sex.Male);
    }
    // 女性だけの集合を返す
    public IEnumerable<Customer> Females(this IEnumerable<Customer> customers)
    {
        return customers.Where(c => c.Sex == Sex.Female);
    }
    // 年齢だけの集合を返す
    public IEnumerable<int> Ages(this IEnumerable<Customer> customers)
    {
        return customers.Select(c => c.Age);
    }
}
// 男性の平均年齢を求める var age = customers.Males().Ages().Average();
public sealed class CustomerList : List<Customer>
{
    public CustomerList Males() { /* 省略 */ }
    public CustomerList Females() { /* 省略 */ }
    public List<int> Ages() { /* 省略 */ }
}
// 男性の平均年齢を求める var age = customers.Males().Ages().Average();
できるやん!
List<Customer> 以外のコレクションでは使えない!
// 配列で返ってくると... Customer[] array = GetCustomers(); // array.Males(); <- 呼び出せない // HashSet で返ってくると... HashSet<Customer> hashSet = GetCustomers(); // hashSet.Males(); <- 呼び出せない // Dictionary で返ってくると... Dictionary<int, Customer> dictionary = GetCustomers(); // dictionary.Values.Males(); <- 呼び出せない
// 配列で返ってくると... Customer[] array = GetCustomers(); array.Males(); // <- OK! // HashSet で返ってくると... HashSet<Customer> hashSet = GetCustomers(); hashSet.Males(); // <- OK! // Dictionary で返ってくると... Dictionary<int, Customer> dictionary = GetCustomers(); dictonary.Values.Males(); // <- OK!
using Hoge.Entities
// 名前空間を揃えていないと、別途 using で取り込まないといけない
// using Hoge.Extensions;
public class Foo {
    public void Bar(IEnumerable<Customer> customers) {
        // ここで IntelliSense の候補に拡張メソッドが出ない
        customers.
    }
}
IntelliSense が効かないメソッドは誰も使いません!