読者です 読者をやめる 読者になる 読者になる

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

リンク

Predicate(T) デリゲート (System)