C#赢了,不允许我这样做。
foreach (Point point in filledPoints)
{
point.X = 0;
}
filledPoints是List<Point>
它给了我一个编译器错误:&#34; fillPoints是一个foreach迭代变量,因此关联的成员不能编辑&#34; (对不起,该消息是德语,我很难翻译)。但这有效:
foreach (Point point in filledPoints)
{
Point point2 = point;
point2.X = point2.X / oldSize.Width * Size.Width;
}
为什么这不起作用,是否有更优雅的方式绕过它?
答案 0 :(得分:6)
这是因为Point不是引用类型(它是结构而不是类)。所以foreach中的point变量实际上并不是对原始Point的引用,它是一个副本。编译器不允许你修改它,因为(我假设)你很容易认为你正在改变你原来的。
我不确定是否有更好的方法,但你可以做这样的事情来解决这个问题:
for (int i = 0; i < filledPoints.Count; i++)
{
Point temp = filledPoints[i];
temp.X = 10;
filledPoints[i] = temp;
}
答案 1 :(得分:1)
@Cathal很接近。你需要像这样使用for循环:
for(int i = 0; i < points.Length; i++)
{
//This copies the value of the point at the i index into a variable called point
Point point = points[i];
//Modifying the point.X property of the copy
point.X = 0;
//This replaces the point that is at the i index, with the new point that has the modified X property
points[i] = point;
}
小提琴here
修改强>
我在我的小提琴中添加了一些注释和附加代码,以说明为什么你的foreach不按照思考的方式工作。
答案 2 :(得分:-2)
如果使用for循环,您将能够分配存储在filledPoints中的对象。
select
date_format(date_created, '%b') month,
month(date_created) pivot,
sum(case when a.state = 'created' then 1 else 0 end) created,
sum(case when a.state = 'notified' then 1 else 0 end) notified,
sum(case when a.state = 'confirmed' then 1 else 0 end) confirmed,
sum(case when a.state = 'approved' then 1 else 0 end) approved,
sum(case when a.state = 'authorized' then 1 else 0 end) authorized,
sum(case when a.state = 'attended' then 1 else 0 end) attended,
sum(case when a.state = 'canceled' then 1 else 0 end) canceled,
count(a.id) as total
from activities a
group by 1 order by pivot desc;
注意:根据您使用的收藏类型,您可能需要更换&#34; .Length&#34;在上面的代码中使用&#34; .Count()&#34;。