Partition 関数
シーケンスの要素を、述語関数を満たす要素と満たさない要素に分割する Partition 関数(メソッド)を作ってみました。
using System; using System.Collections.Generic; using System.Linq; class Program { static Tuple<List<T>, List<T>> Partition<T>(IEnumerable<T> xs, Predicate<T> pred) { var ok = new List<T>(); var ng = new List<T>(); foreach (var x in xs) { if (pred(x)) { ok.Add(x); } else { ng.Add(x); } } return Tuple.Create(ok, ng); } static void Main() { var xs = new[] { 1, 2, 3, 4, 5 }; // 偶数と奇数に分割する var t = Partition(xs, e => e % 2 == 0); Console.WriteLine(string.Join(", ", t.Item1)); // 2, 4 Console.WriteLine(string.Join(", ", t.Item2)); // 1, 3, 5 // ゼロまたは正と負に分割する var t2 = Partition(new[] { 1, -3, 22, -90, -100 }, e => e >= 0); Console.WriteLine(string.Join(", ", t2.Item1)); // 1, 22 Console.WriteLine(string.Join(", ", t2.Item2)); // -3, -90, -100 } }
実行結果です。
2, 4 1, 3, 5 1, 22 -3, -90, -100