C#在列表中迭代时设置对象的属性

时间:2017-12-01 20:00:43

标签: c# properties iteration

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;
}   

为什么这不起作用,是否有更优雅的方式绕过它?

3 个答案:

答案 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;。