更新对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;
    }
}

感觉我在这里错过了一些简单的东西,完成我想要的东西应该不会有太多麻烦。

做这类事情的最佳实践方式是什么?

更新对linq查询返回的对象的原始引用

执行此操作时:

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方法