|
■No59830 (ラムダ さん) に返信
>> invaderGroupQuery = new Dictionary<int, List<Invader>>();
> リスト化せずに、 Dictionary<int,Invader> invaderGroupQuery = new Dictionary<int,Invader>();
> で一度やってみたのですが、 Dictionary<int,Invader> の部分を Dictionary<int,List<Invader>> にするのっていうのは、
No59780 で、shuさんは「Location.X毎にリストにしたもの」と書いておられますよね。
「Location.X毎のInvader」ではないですよ。
> List<>にしないと中身を参照できないってことなんでしょうか??
Invaders の中には「X が同じで、Y のみが違う Invader」物も含まれています。
ですから Location.X ごとにグループ化した場合、Y の違うInvaderが 1 つ以上見つかるわけです。
ゆえに「group invader by invader.Location.X into groupedInvaders」を再現させるなら、
Dictionary<int, Invader> ではなく、Dictionary<int, List<Invader>> あるいは
Dictionary<int, Invader[]> などで管理する必要があるということです。
たとえば、Invaders コレクション内にある各 Invader が、
(10, 10) (30, 10) (40, 10)
(10, 20) (20, 20) (40, 20)
(10, 30) (30, 30)
(20, 40)
という X, Y 座標を持った 9 個の Invader から構成されていた場合、
var invaderGroupQuery = from invader in Invaders
group invader by invader.Location.X into groupedInvaders
select groupedInvaders;
によって抽出されるコレクションは、
X=10 → (10, 10), (10, 20), (10, 30) の 3件
X=20 → (20, 20), (20, 40) の 2件
X=30 → (30, 10), (30, 30) の 2件
X=40 → (40, 10), (40, 20) の 2件
という形でグループ化されることになります。
そのため、Dictionary<int, List<Invader>> にしたという訳ですね。
とはいえ、その後に続く
foreach (var invaderColumn in invaderGroupQuery)
{
var invaderQuery = from invader in invaderColumn
orderby invader.Location.Y descending
select invader;
という Linq 式を見れば、実際には 各 X ごとに、Y の降順でソートして、
その先頭要素を(bottomInvader として)取り上げるコードであることが分かります。
すなわち、
X=10 → (10, 30)
X=20 → (20, 40)
X=30 → (30, 30)
X=40 → (40, 20)
が最終的に取り出せれば良いわけです。
それを考慮し、取り出し方を少し変えてやれば、Dictionary<int, Invader> でも同じ結果を得られます。
実際、私が No59829の後半に書いたコードでは、Dictionary<int, Invader> で集計していますよね。
> groupedInvaders は List<Invader>を参照する為?に設定して、
グループ化集計のためです。上記の例でいえば、
X=10 → (10, 10), (10, 20), (10, 30) の 3件
の「3件」を核のするためのものです。
> 判定で invaderGroupQuery.ContainsKey 内 invader.Location.X が存在するかを判断して、
> true の場合は groupedInvaders に invaderGroupQuery の invader.Location.X を追加。
違います。ContainsKey で、同じ X 値グループの List が登録済みかどうかを判断し、
登録済みなら、その List に Invader を追加するのです。
> false の場合は groupedInvaders に List<Invader> で Invaderの変数を全挿入して、
これも認識がブレているようです。Invaderの変数を全挿入してはいませんよ。
ContainsKey で 同じ X 値グループの List が登録済みかどうかを判断し、
まだ登録されていなければ、新たにその X 値グループとして、
Invader が 1つだけ登録された List を割り当てています。
|