ネタ元 → カブるべからず
「配列やコレクションから重複要素を取り除きたい」
ふむ。たとえば { 1, 3, 5, 1, 5, 2, 4 } → { 1, 3, 5, 2, 4 } ってことやね。
与えられた集合をソートしてかまわんなら話は簡単。
一旦ソートし "いっこ前のと同じでなければ列挙" すればいい。
やってみましょ。
using System;
using System.Collections.Generic;
public delegate Result BinaryFunction<Arg1,Arg2,Result>(Arg1 arg1, Arg2 arg2);
class Program {
public static IEnumerable<T> Unique<T>(IEnumerable<T> en, BinaryFunction<T,T,bool> pred) {
IEnumerator<T> enumr = en.GetEnumerator();
if ( enumr.MoveNext() ) {
T val = enumr.Current;
yield return val;
while ( enumr.MoveNext() ) {
T valn = enumr.Current;
if ( !pred(val, valn) ) {
val = valn;
yield return val;
}
}
}
}
public static void Main() {
int[] input = { 1, 2, 3, 4, 4, 5, 6, 6, 6, 7 };
// 隣接する等しい要素を端折る。
foreach ( int item in Unique(input, delegate(int x, int y) { return x == y; }) ) {
Console.WriteLine(item);
}
}
}