Assign Values to object properties by Id
我有一个用于保存值的对象的全局列表,值连同ID一起被解析到ObjectManager函数中,ID只能是列表中所述的内容。我希望函数更新对应于Id的值。
最初我尝试使用一个foreach循环,它没有更新列表中的对象。使用下面的代码确实会更新列表中的对象,但它只检查中解析的ID,我现在在早期使用switch语句尝试此操作。
实现我想做的事情的最佳方法是什么?
样本代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public List <Object> obj = new List <Object>
{
new Object { id = 4, val = 20 },
new Object { id = 1, val = 34 },
new Object { id = 16, val = 27 },
new Object { id = 9, val = 36 }
};
public void ObjectManager (List <Object> myobj, int id, int val )
{
int i = 0;
int j = 0;
while (i < myobj .Count)
{
if(myobj [i ].id == id )
{
j = myobj [i ].val;
myobj [i ].val = j + val ;
}
}
} |
- foreach将集合设置为只读。因此,可以使用foreach循环更新集合
- @湍流,你的意思是说不能用foreach循环更新集合。
- @学习新的-在这种情况下不是。我是说foreach循环使收集成为只读的
- 我不明白你的实际问题是什么,你是在问如何用switch语句来做这个吗?
- 为什么j=myobj[i].val;myobj[i].val=j+val;而不是myobj[i].val=myobj[i].val+val?
- 如果我不清楚的话,我道歉-我在问最好的方法来做到这一点-无论是通过循环、切换还是其他方式,我只想了解一种最佳实践方法(而不是一个预兆),它将解决我的问题。
- 最好的方法是基于意见,你可以使用3dd的方法(前提是ID是唯一的)
你应该用字典来做这个。
您可以在字典中找到许多与解决方案相关的添加或更新。像这个还是这个
- 是的,通常,尽管我保持这个简单,但会有更多的属性,我只是想要一个简单的例子。
- 请看一下字典,你也可以用对象作为值参数,这样你就可以根据需要设计字典了。
- 如果你想通过某种ID找到对象,那么字典就是你想要的。如果每个ID有多个属性,那么创建一个属性对象(听起来好像已经有了),并将其存储在每个ID中。
您可以使用FirstOrDefault()选择要更新的项目。
江户十一〔一〕号
如果找不到该项,FirstOrDefault()将返回空值,因此在更新该项之前需要检查空值。
埃多克斯1〔3〕
- 酷-看起来不错,应该试试看,这否定了使用任何循环。还应更新任何属性ID
- @Selrekjohn:它不否定循环,FirstOrDefault基本上是一个循环,它使用提供的谓词检查每个项,并在找到某个项时停止。如果避免循环是很重要的(例如,因为您的集合很大,而且您经常这样做),那么这不是您的解决方案。
- 抱歉,写得不好,是的,它仍然是一个循环,但我所做的(错误的)是一个while循环,然后是foreach循环等等。
- 正如@chris所说,这仍然是一个循环,只是一种使用谓词编写它们的优雅方式。如果您担心循环迭代太多次,那么Dictionary将是更好的选择。