0

ネストされた 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()));
4

2 に答える 2

2

定期便foreachが一番です。LINQ はクエリ用に設計されています。1 行で記述できますが、エレガントでも読みやすくもありません。方法は次のとおりです。

map.Objects.ForEach(l => l.MapObjects.ForEach(t => Enumerable.Range(0, t.Points.Count).ToList().ForEach(i => t.Points[i] *= map.Scale)));

バージョンが機能しなかった理由Vector2は、値型であるためです。クエリでは、その値がコピーされるためp => p = ...、変数のコピーに割り当てることになります。

元のコードを使用してください。LINQ はループに代わるものではありません。

于 2012-05-19T17:19:49.790 に答える
1

Linq を使用してアイテムを収集することもできます (実際、Resharper はネストされた foreach から linq へのリファクタリングを提供します) が、収集するものと更新するものに注意する必要があります。

最初の linq クエリ構文の例では、Points のコピーを新しい List に収集し、この新しいリストの各要素を Vector2 の新しいインスタンスに置き換えます。Vector2 が参照タイプであったとしても、元の map.Objects-substructure ではなく、新しいリストのみが変更されます。

それはあなたが望むように動作します

  • 値型ではなく参照を使用し、
  • Vector2 の代わりの項目のプロパティを割り当てます。

    test[i].X *= map.Scale

于 2012-05-31T14:12:58.180 に答える