更新对linq查询返回的对象的原始引用
本文关键字:对象 引用 原始 返回 linq 查询 更新 | 更新日期: 2023-09-27 18:19:42
我想做这样的事情:
[HttpPost]
public JsonResult Submit(Person UpdatedPerson)
{
//Find the original Person that the model was bound against
//Update the collection's reference to reflect the changes
//from the posted model version
Person original = PersonCollection
.SingleOrDefault(p=>p.Id == UpdatedPerson.Id);
if(original!=null)
{
//update the value from PersonCollection
//doesn't work, of course
original = UpdatedPerson;
}
}
我目前正在做这个:
[HttpPost]
public JsonResult Submit(Person UpdatedPerson)
{
//Find the index into PersonCollection for the original
//model bound object, use the index to directly mutate the
//PersonCollection collection
int refIndex = -1;
for(int i=0;i<PersonCollection.Length;i++)
{
if(PersonCollection[i].Id == UpdatedPerson.Id)
{
refIndex = i;
break;
}
}
if(refIndex >= 0)
{
PersonCollection[refIndex] = UpdatedPerson;
}
}
感觉我在这里错过了一些简单的东西,完成我想要的东西应该不会有太多麻烦。
做这类事情的最佳实践方式是什么?
执行此操作时:
original = UpdatedPerson;
您只是将引用分配给original
,因此original
现在指向与UpdatedPerson
指向的对象相同的对象。这就是为什么您将丢失从集合中检索到的对象的引用值。
请尝试分配各个字段。
在第一个示例中,您进行了一个变量声明:
Person original;
original
变量是一个引用。
然后你把它分配给列表中的某个项目
然后你打这样的电话:
original = UpdatedPerson;
在这个调用中,您更新的是变量引用,而不是集合中的任何内容。
你可能想做的是这样的事情(假设Person是一个类,而不是一个结构):
original.UpdateValuesToMatch(UpdatedPerson);
但是您必须在person对象上创建这样一个方法。
或者在你的第二种方法中,你可以简化为:
if(PersonCollection[i].Id == UpdatedPerson.Id)
{
refIndex = i;
break;
}
}
if(refIndex >= 0)
{
PersonCollection[refIndex] = UpdatedPerson;
}
至
if(PersonCollection[i].Id == UpdatedPerson.Id)
{
PersonCollection[i] = UpdatedPerson;
break;
}
}
描述
您可以使用FindIndex
样品
[HttpPost]
public JsonResult Submit(Person UpdatedPerson)
{
//Find the index into PersonCollection for the original
//model bound object, use the index to directly mutate the
//PersonCollection collection
int refIndex = PersonCollection.FindIndex(x => x.Id == UpdatedPerson.Id);
if (refIndex != -1)
PersonCollection[refIndex] = UpdatedPerson;
}
更多信息
- List.FindIndex方法