using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { static class LINQ { static void Main(String[] args) { Console.WriteLine("単一要素の取得"); 単一要素の取得(); Console.WriteLine("複数要素の取得"); 複数要素の取得(); Console.WriteLine("集計"); 集計(); Console.WriteLine("判定"); 判定(); Console.WriteLine("集合"); 集合(); Console.WriteLine("ソート"); ソート(); Console.WriteLine("射影"); 射影(); Console.WriteLine("結合"); 結合(); Console.WriteLine("変換"); 変換(); } private static void 単一要素の取得() { var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine(source.ElementAt(2)); // -> 52 Console.WriteLine(source.ElementAtOrDefault(8)); // -> 0 Console.WriteLine(source.First()); // -> 11 Console.WriteLine(source.First(e => e > 15)); // -> 16 Console.WriteLine(source.Last()); // -> 8 Console.WriteLine(source.Last(e => e > 15)); // -> 21 //Console.WriteLine(source.Single()); // -> System.InvalidOperationException: シーケンスに複数の要素が含まれています Console.WriteLine(source.Single(e => e > 50)); // -> 52 } private static void 複数要素の取得() { var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine(source.Where(e => e > 20).ToResult()); // -> {52, 21} Console.WriteLine(source.Distinct().ToResult()); // -> {11, 16, 52, 21, 8} Console.WriteLine(source.Skip(3).ToResult()); // -> {21, 8, 8} Console.WriteLine(source.SkipWhile(e => e < 20).ToResult()); // -> {52, 21, 8, 8} Console.WriteLine(source.Take(3).ToResult()); // -> {11, 16, 52} Console.WriteLine(source.TakeWhile(e => e < 20).ToResult()); // -> {11, 16} } private static void 集計() { var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine("集計"); Console.WriteLine(source.Max()); // -> 52 Console.WriteLine(source.Min()); // -> 8 Console.WriteLine(source.Average()); // -> 19.3333333333333 Console.WriteLine(source.Sum()); // -> 116 Console.WriteLine(source.Count()); // -> 6 Console.WriteLine(source.Aggregate((now, next) => Math.Max(now, next))); // -> 52 // 参考:標本分散 double ave = source.Average(); Console.WriteLine(source.Sum(e => Math.Pow(e - ave, 2)) / source.Count()); // -> 234.555555555556 } private static void 判定() { var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine(source.All(e => e > 10)); // -> False Console.WriteLine(source.Any(e => e > 10)); // -> True Console.WriteLine(source.Contains(20)); // -> False Console.WriteLine(source.SequenceEqual(new[] { 11, 16, 21, 52, 8, 8 })); // -> False } private static void 集合() { var first = new[] { 11, 16, 52, 21, 8, 8 }; var second = new[] { 16, 21, 20, 3 }; Console.WriteLine(first.Union(second).ToResult()); // -> {11, 16, 52, 21, 8, 20, 3} Console.WriteLine(first.Except(second).ToResult()); // -> {11, 52, 8} Console.WriteLine(first.Intersect(second).ToResult()); // -> {16, 21} } private static void ソート() { var source = new[] { new{Name = "C#", Age = 11}, new{Name = "Java", Age = 16}, new{Name = "Groovy", Age = 8}, new{Name = "Scala", Age = 8}, }; Console.WriteLine(source.OrderBy(e => e.Age).ToResult()); // -> {{ Name = Groovy, Age = 8 }, // { Name = Scala, Age = 8 }, // { Name = C#, Age = 11 }, // { Name = Java, Age = 16 }} Console.WriteLine(source.OrderByDescending(e => e.Age).ToResult()); // -> {{ Name = Java, Age = 16 }, // { Name = C#, Age = 11 }, // { Name = Groovy, Age = 8 }, // { Name = Scala, Age = 8 }} Console.WriteLine(source.OrderBy(e => e.Age) .ThenBy(e => e.Name.Length).ToResult()); // -> {{ Name = Scala, Age = 8 }, // { Name = Groovy, Age = 8 }, // { Name = C#, Age = 11 }, // { Name = Java, Age = 16 }} Console.WriteLine(source.OrderBy(e => e.Age) .ThenByDescending(e => e.Name.Length).ToResult()); // -> {{ Name = Groovy, Age = 8 }, // { Name = Scala, Age = 8 }, // { Name = C#, Age = 11 }, // { Name = Java, Age = 16 }} Console.WriteLine(source.Reverse().ToResult()); // -> {{ Name = Scala, Age = 8 }, // { Name = Groovy, Age = 8 }, // { Name = Java, Age = 16}, // { Name = C#, Age = 11 }} } private static void 射影() { var source = new[] { new{Name = "C#", Age = 11}, new{Name = "Java", Age = 16}, new{Name = "Groovy", Age = 8}, new{Name = "Scala", Age = 8}, }; Console.WriteLine(source.Select(e => e.Name).ToResult()); // -> {C#, Java, Groovy, Scala} Console.WriteLine(source.SelectMany(e => e.Name.ToCharArray()).ToResult()); // -> {C, #, J, a, v, a, G, r, o, o, v, y, S, c, a, l, a} Console.WriteLine(source.GroupBy(e => e.Age).ToResult()); // -> {Key=11, Source={{ Name = C#, Age = 11 }}, // Key=16, Source={{ Name = Java, Age = 16 }}, // Key=8, Source={{ Name = Groovy, Age = 8 }, { Name = Scala, Age = 8 }}} } private static void 結合() { var outer = new[] { new{Name = "C#", Age = 11}, new{Name = "Java", Age = 16}, new{Name = "Groovy", Age = 8}, new{Name = "Scala", Age = 8}, }; var outer2 = new[] { new{Name = "Python", Age = 21}, new{Name = "COBOL", Age = 52}, }; var inner = new[] { new{Name = "C#", DesignedBy = "Microsoft"}, new{Name = "Java", DesignedBy = "Sun Microsystems"}, new{Name = "Java", DesignedBy = "Oracle"}, }; Console.WriteLine(outer.Join(inner, o => o.Name, i => i.Name, (o, i) => new { o.Name, o.Age, i.DesignedBy}).ToResult()); // -> {{ Name = C#, Age = 11, DesignedBy = Microsoft }, // { Name = Java, Age = 16, DesignedBy = Sun Microsystems }, // { Name = Java, Age = 16, DesignedBy = Oracle }} Console.WriteLine(outer.GroupJoin(inner, o => o.Name, i => i.Name, (o, i) => new { o.Name, o.Age, DesigndBy = i.Select(e => e.DesignedBy).ToResult() }).ToResult()); // -> {{ Name = C#, Age = 11, DesigndBy = {Microsoft} }, // { Name = Java, Age = 16, DesigndBy = {Sun Microsystems, Oracle} }, // { Name = Groovy, Age = 8, DesigndBy = {} }, // { Name = Scala, Age = 8, DesigndBy = {} }} Console.WriteLine(outer.Concat(outer2).ToResult()); // -> {{ Name = C#, Age = 11 }, // { Name = Java, Age = 16 }, // { Name = Groovy, Age = 8 }, // { Name = Scala, Age = 8 }, // { Name = Python, Age = 21 }, // { Name = COBOL, Age = 52 }} Console.WriteLine(outer.DefaultIfEmpty().ToResult()); // -> {{ Name = C#, Age = 11 }, // { Name = Java, Age = 16 }, // { Name = Groovy, Age = 8 }, // { Name = Scala, Age = 8 }} Console.WriteLine(outer.Zip(outer2, (o1, o2) => o1.Name + "&" + o2.Name).ToResult()); // -> {C#&Python, Java&COBOL} } private static void 変換() { ArrayList mixed = new ArrayList { "C#", "Java", 3.141592653, "Groovy", "Scala" }; Console.WriteLine(mixed.OfType().ToResult()); // -> {C#, Java, Groovy, Scala} //Console.WriteLine(mixed.Cast().ToResult()); // -> System.InvalidCastException: // 型 'System.Double' のオブジェクトを型 'System.String' にキャストできません。 } /// /// IEnumerable<T> を文字列に変換します。 /// /// 要素の型 /// 変換元の IEnumerable<T> /// 変換した文字列 static String ToResult(this IEnumerable source) { return "{" + string.Join(", ", source) + "}"; } /// /// IEnumerable<IGrouping<TKey, TSource>> を文字列に変換します。 /// /// キーの型 /// 要素の型 /// 変換元の IEnumerable<IGrouping<TKey, TSource>> /// 変換した文字列 static String ToResult(this IEnumerable> source) { return source.Select(group => string.Format("Key={0}, Source={1}", group.Key, group.ToResult())).ToResult(); } } }