#これを書いた理由
レコードの重複を除く処理って普通に必要なので。
そして、これを今のかしこい子がやるようにシンプルにきれいにやりたいのです。
#初心者レベルの私(文系の元コボラー)が安直に思いつく方法
1.チェック列を作成
2.Collectionをソート
3.行の内容を退避
4.次の行と、退避した前の内容が一致していたらチェック列にマーク
5.マークした列を削除
できるんですけど、実際いまそうやって作られてるやつがいっぱいあるのですけど、
ダサい……。
#単純に重複行を削除するだけのオブジェクトを作ります。
たとえばこういうCollectionがあったとして
2行目と6行目に佐伯真彩が重複しているので、6行目が削除したい行になります。
##重複行を削除するためのオブジェクト
###必要っぽいのは
DataView.ToTable メソッド
distinct Boolean
true の場合、返された DataTable にはすべての列に対して重複しない値を持つ行が含まれています。 既定値は false です。
つまり「ToTable(true)」って書けば重複行を削除してくれるらしい。
で、Collectionをこの「DataView」にするためには
DataTable.DefaultView プロパティ
どっちも名前空間はSystem.Data(デフォルトであるやつ)なので、Initialiseに新たに名前空間とかを設定する必要はありません。
###これを踏まえてコードステージに1行書きます。
入力引数は処理したいCollection、出力引数はカラのCollectionです。
outCollection=inCollection.DefaultView.ToTable(true)
これで重複行を削除するオブジェクトができます。
#単純じゃない場合(重複列を指定したい)※未解決
たとえばデータに連番がついていたら、行全体が重複ってことにはなりません。
「連番を除く列で重複だったら」ということにしないといけないのですけど……。
###さっきの「DataView.ToTable メソッド」のパラメータにもうひとつ書いてあるのを使う
columnNames String[]
返された DataTable に含まれる列名の一覧を格納する文字列の配列。 DataTable には、この配列内に表示される順序で、指定された列が含まれています。
そしたらフィルタしたい列名を後ろにつけたらいいのかなーって
outCollection=inCollection.DefaultView.ToTable(true,"氏")
###複数列をフィルタ対象にするのは
できます。「String[]」って書いてあるからこれは配列です。なので複数書けます。引数を後ろへつなげるだけです。
outCollection=inCollection.DefaultView.ToTable(true,"氏","名","氏カナ","名カナ")
でもこれだとやっぱり上のと同じように、フィルタ対象ではない列(例だと「SEQ」)が出力に出てこないです。
#いま詰まっていること
- 出力するときには、入力したCollectionと同じ全部の列で出力されたい
#まだ終わりではないです
Qiitaで質問するって、使い方としてどうかと思いましたが、誰か教えてください。
あと、皆様のとこの御社では、Blue Prismで重複削除の処理を実装するときには、どういう書き方をされているのでしょうか。教えてください。