トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

11-15 リストからuniqな値のみを取り出す

問題

与えられたリストxsの中から、2回以上出現するものを全部取り除いてください。

サンプル入力
[3, 1, 4, 1, 5, 9, 2, 6, 5]
サンプル出力
[3, 4, 9, 2, 6]
これはアレイのuniqの派生問題です。
リストとかアレイという言葉は言語によってまちまちの意味で使われているので、
「配列のようなもの」という漠然とした意味にとって構いません。


ソース (LINQで連番付与)

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] intArr = { 3, 1, 4, 1, 5, 9, 2, 6, 5 };
        int cnt = 0;
        var query = intArr.Select(X => new { rn = ++cnt, Val = X })
                          .GroupBy(X => X.Val)
                          .Where(X => X.Count() == 1)
                          .Select(X => new { X.Key, minRn = X.Min(Y => Y.rn) })
                          .OrderBy(X => X.minRn);

        foreach (var each in query) {
            Console.WriteLine(each);
        }
    }
}


ソース (相関サブクエリを使用)

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] intArr = { 3, 1, 4, 1, 5, 9, 2, 6, 5 };
        var query = intArr.Where(X => intArr.Count(Y => Y == X) == 1);

        foreach (var each in query) {
            Console.WriteLine(each);
        }
    }
}


実行結果

{ Key = 3, minRn = 1 }
{ Key = 4, minRn = 3 }
{ Key = 9, minRn = 6 }
{ Key = 2, minRn = 7 }
{ Key = 6, minRn = 8 }


解説

相関サブクエリを使用するのが分かりやすいと思います。