Linqって強力ですね。「こういう機能実装できないかな」って考えたときに、真っ先にSQLのDISTINCTが思い浮かびました。そこで、「LINQ使って楽に実装できないのか?」と考えつき、やってみました。
予想通りに動きすぎて、本当に怖いですよね。最近、マイコンプログラミングばかりやってるもので、書いてるとおりに動かないことなんて日常茶飯事なのです。実際のところは、書いてるとおりにしか動いてないわけですがそこには突っ込まないでくださいね。
では、単純にすげーと思ったソースコードを記しておきます。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class IntegerClass { public int Number { get; set; } } class Program { static void Main(string[] args) { var list = new List<IntegerClass>(); list.AddRange(new IntegerClass[]{ new IntegerClass() { Number = 1 }, new IntegerClass() { Number = 1 }, new IntegerClass() { Number = 1 }, new IntegerClass() { Number = 1 }, new IntegerClass() { Number = 2 }, new IntegerClass() { Number = 2 }, new IntegerClass() { Number = 3 } }); Console.WriteLine(list.Select(n => n.Number).Distinct().Count()); Console.ReadLine(); } } } > 3
これ自体は全く意味のない処理なんですが、何かに応用できそうな匂いはしますね。少なくても、私のゲームでは必要な処理でした。
それ以外で気になったことがあります。new IntegerClass[]{}内では、ソースコードの自動整形が効きませんでした。何か理由があったりするんでしょうか。
解説
まぁ、ソースコードだけペッと貼りつけて終わりって言うのも芸がないので、少しだけ解説を。このソースコードはLinqを用いています。きちんとusingしましょうね。
で、SQLと考え方は同じです。一番シンプルな形だと、SELECT (欲しい物)WHERE (条件)といった使い方をしますね。まさにその形というのが読み取れます。今回はWHEREも必要ないので、それ以上にシンプル。
Select(それぞれの要素を受け取る変数名(IntegerClassクラス) => 得られる集合で欲しい属性).Distinct().Count()
Distinctは重複要素を排除するという意味でした。
Countは集合の個数です。