ネストされた for/foreach ループを使用して、リスト内の項目を変更する必要があります。問題は、ドット表記の有無にかかわらず、LINQ を使用して動作させることができなかったことです。従来の方法は次のように機能しました。
foreach (MapObjectLayer mapObjectLayer in map.Objects)
{
foreach (MapObject mapObject in mapObjectLayer.MapObjects)
{
for (int i = 0; i < mapObject.Points.Count; i++)
{
mapObject.Points[i] = new Vector2(
mapObject.Points[i].X * map.Scale,
mapObject.Points[i].Y * map.Scale);
}
}
}
LINQ を使用すると、これは失敗しました。
var test = (from mol in map.Objects
from mo in mol.MapObjects
from p in mo.Points
select p).ToList();
for (int i = 0; i < test.Count(); i++)
{
test[i] = new Vector2(
test[i].X * map.Scale,
test[i].Y * map.Scale);
}
これは失敗しました:
map.Objects.ForEach(l => l.MapObjects.ForEach(t => t.Points.ForEach(p => p = p * map.Scale)));
ドット表記のバリアントを機能させることができれば、とてもうれしいのですが、なぜ失敗するのか手がかりがありません。デバッガーを使用して Points リストを調べると、2 つの LINQ バリアントを使用してベクトルが乗算されていないことが明らかです。
更新: Vector2 は構造体です
更新:ここに、私が見つけたさらに2つのワンライナーがあります(機能するもの):
map.Objects.SelectMany(m => m.MapObjects).ToList().ForEach(o => o.Points = o.Points.Select(p => p * 2).ToList());
map.Objects.ForEach(l => l.MapObjects.ForEach(t => t.Points = t.Points.Select(p => p * 2).ToList()));