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 が効かないメソッドは誰も使いません!