ジェネリクス機能を使ったTListを無名メソッドでソートするにはテンミニッツサイトストラテジーサンデーアマグラマーNorimakiの開発日誌。その他Tipsども、Norimakiです。今回は無名メソッドでのソートについてです。毎回、ハマるので記事にしてみました。必要に応じてソートすると。いう状況を想定しています。基本的にソースはこんな感じ。Item1,Item2:integer):Integerbeginend));RtはTList<integer>です。Item1,Item2:TMyRecord):Integerbeginend));になります。結論から言うと無名メソッドの引数、Item1・Item2は、Rtに格納されている値です。Rtのインデックスではありません。僕はいつも勘違いしてしまうわけですよ。格納している値がIntegerですし。比較する際にも、Item1・Item2がRtのインデックスと勘違いして、Result:=Rt[Item1]-Rt[Item2];みたいに書いちゃうわけです。実際は、Result:=Item1-Item2;が正解。ここでは、TListがIntegerを格納しているから勘違いするわけで、レコードとかを格納していると、間違わないんですけどね。僕が間違える原因のもう一つとして挙げられるのが、僕は普段、インデックスをリスト化している。いうことかというと、まず、必要なデータをレコード型で定義しておいて、それをTList<T>に格納すると。実体をソートするのではなく別途インデックスのリストを用意して、そちらを操作するということです。データの実体を格納するのに、TList<TNYxxxxx>というTListを用意したとします。レコード(TNYxxxxx)の内容としては、名前(Name)と年齢(age)の2つのデータを保持するとします。そのリストはこんな感じとします。(佐藤一郎,15歳)(斎藤次郎,20歳)(工藤三郎,37歳)(灰原史郎,25歳)(野比五郎,41歳)(剛田六郎,31歳)(毛利七郎,75歳)(武田八郎,74歳)(細川九郎,55歳)(加藤十朗,34歳)で、インデックスをリスト化するとは、別途リスト(TList<integer>)を用意してフィルタリングをする際に上記データをインデックスで保持するということです。実際にデータが必要になった場合は、まずリスト(TList<integer>)からインデックスを取得して、その後実体(TList<TNYxxxxx>)をインデックスで参照すると。分かりにくいので、具体例を。上記のデータは上からインデックスを付けると(佐藤一郎,15歳)がインデックス0(TList<TNYxxxxx>[0])。(斎藤次郎,20歳)がインデックス1(TList<TNYxxxxx>[1])。以下同様に、(加藤十朗,34歳)がインデックス9(TList<TNYxxxxx>[9])。例として、「田」という文字を名前に含む人をフィルタリングするとします。すると、(剛田六郎,31歳)...インデックス5(TList<TNYxxxxx>[5])。(武田八郎,74歳)...インデックス7(TList<TNYxxxxx>[7])。フィルタリングした結果です。インデックスのリストはこんな感じになります。インデックス1(TList<integer>[1])さて、ここからが本題。年齢をもとにソートをします。ソート対象はインデックスのリスト(TList<integer>)です。Dt1,Dt2:TNYxxxxx;beginDt1:=FBodyList[Item1];Dt2:=FBodyList[Item2];Result:=Dt1.Age-Dt2.Age;end));こんな感じになるでしょうか。Dt2:=FBodyList[FIndexList[Item2]];12Dt1:=FBodyList[FIndexList[Item1]];Dt2:=FBodyList[FIndexList[Item2]];とやってしまうことです。FBodyListが実体のリスト、TList<TNYxxxxx>でFIndexListがインデックスのリスト、TList<integer>になります。無名メソッドでの引数、Item1・Item2はTListに格納されている値です。(Index1・Index2はFIndexListにおけるItem1,Item2のインデックス)上記のサンプルで言うと、Item1、Item2は5とか7であり、0や1ではないということです。ここら辺をいつも勘違いするので記事にしておきました。通常はXXX:=TList<integer>.Create;などとインスタンスを生成してXXX[0]というように書くのが正解。TList<integer>[0]の方が区別しやすいかなと思ってこっちの書き方にしました。Norimakiでした。シェアするツイートフォローするnorimaki関連記事コンポーネントの初期化処理ども、Norimakiです。今回はコンポーネントの初期化処理を書いてみようかと。コンポーネントの初期化処理というのは、こんな感じです。目的のコンポーネ...記事を読む多重起動チェックども、Norimakiです。今回は多重起動チェックを。ミューテックスを使って多重起動チェックをする方法があるそうです。どこからかコードを引っ張ってきて書いたものです。どこから引用したものか失念してしまいました。記事を読むFormPositionをいじってみるども、Norimakiです。手を加えて使わせていただいています。【FormPosition】...記事を読むDelphi+IndyでMD5、SHA1、BASE64ども、Norimakiです。Delphiでのソースはなかなか当たりません。いうことで、DelphiでSHA1、MD5、BASE64を求める方法を。日本語は通らないみたいです。記事を読むTDictionaryをフィルタリング&ソートするども、Norimakiです。久しぶりにDelphiのお話です。Delphiでデータを扱う際にTDictionaryとかTListなどをよく使います。ソートが出来ないという問題にぶち当たります。...記事を読む手続き・関数をメソッドにする方法ムームードメインからドメイン更新のメールが来ました。面倒臭いことが何よりも大嫌いDelphi(ツール開発環境)の最新バージョンが欲しいけれどもさすがにホイホイと購入できるほど余裕は無いわけで。テンミニッツサイトストラテジー.。