【发布时间】:2012-05-26 21:12:25
【问题描述】:
我需要使用嵌套的 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)));
如果我能让点符号变体工作,我会非常高兴,但我不知道它为什么会失败。 使用调试器,通过检查点列表很明显,向量没有使用两个 LINQ 变体相乘。
更新:Vector2 是一个结构体
更新:这是我发现的另外两个单行代码(工作行):
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()));
【问题讨论】:
-
为什么要转成LINQ?
-
为什么要使用 LINQ? LINQ 用于查询,而不是更新。
-
我认为 LINQ 实际上可能更慢,您是否正在寻找“酷单行”?
-
好吧,我只是想知道是否可以通过使用 LINQ 获取实际列表,然后对其执行 foreach 来使代码更优雅。但是不要把这个问题看得太严重,它不是必须使用 LINQ ......我只是好奇我是否能让它工作。是的,一个很酷的单线会很棒:)
-
是否需要修改原始列表中的元素,还是只返回一个带有新元素的新列表?
标签: c# linq .net-3.5 foreach linq-to-objects