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

时间:2012-01-05 14:15:07

标签: c# linq

我想做这样的事情:

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

感觉我在这里缺少一些简单的东西,完成我所追求的东西应该不会那么麻烦。

做这种事情的最佳做法是什么?

3 个答案:

答案 0 :(得分:2)

执行此操作时:

original = UpdatedPerson;

您只是将引用分配给original,因此original现在指向UpdatedPerson指向的同一对象。这就是为什么你丢失了从集合中检索到的对象的参考值。

尝试改为分配各个字段。

答案 1 :(得分:1)

在第一个示例中,您进行了变量声明:

Person original;

original变量是参考。

然后将其分配给列表中的某个项目

然后你会打这样的电话:

original = UpdatedPerson;

在此调用中,您将更新变量引用,而不是集合中的任何内容。

你可能想要做的是这样的事情(Presuming Person是一个类,而不是一个struct):

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

答案 2 :(得分:1)

描述

您可以使用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;
}

更多信息