C# 如何将列表中的对象作为值返回

C# 如何将列表中的对象作为值返回,c#,list,C#,List,我有一个道具列表用户,我想获得具有指定id的用户,而不获取对它的引用 在UserDAO中: public User ReturnUser(int id) { var q = this.Users.Where(x => x.Id == id); return q.ToList()[0]; } 大体上: User newUser = ud.ReturnUser(0); Console.WriteLine(newUser.Name); newUser.Name = "john

我有一个道具列表用户,我想获得具有指定id的用户,而不获取对它的引用
在UserDAO中:

public User ReturnUser(int id)
{
    var q = this.Users.Where(x => x.Id == id);
    return q.ToList()[0];
}
大体上:

User newUser = ud.ReturnUser(0);

Console.WriteLine(newUser.Name);
newUser.Name = "john";
Console.WriteLine(ud.Users[0].Name);
我认为
AsNoTracking()
可能是您想要的方式

public User ReturnUser(int id)
{
    return this.Users.AsNoTracking().FirstOrDefault(x => x.Id == id);
}
此链接提供了有关
AsNoTracking()
的更多信息,但上述内容应该可以实现您希望实现的目标


如果用户对象仅包含基本属性,则可以添加以下方法:

public User ShallowCopy(){
  return (User)this.MemberwiseClone();
}
然后这样做:

//note: no error handling if ID not found
public User ReturnUser(int id)
{
  return this.Users.Single(x => x.Id == id).ShallowCopy();

}
如果您的用户包含复杂类型的属性,如果您不希望这些属性只是引用,那么就必须实现深度复制


有一个合理的说法和一些好的例子

首先,如果您只想进行第一次匹配,请使用
FirstOrDefault()
而不是
Where()

其次,您可以返回结果的克隆:

public User ReturnUser(int id)
{
    var q = this.Users.FirstOrDefault(x => x.Id == id);
    return q?.MemberwiseClone();
}

尝试此方法,但要小心,只有当用户对象只包含基本类型(如int、double、bool)而不包含引用类型时,此方法才会起作用

有关深度复制/深度克隆,请参阅

类程序
{
静态void Main(字符串[]参数)
{
var users=新列表()
{
新用户()
{
Name=“我的名字”,
作业=新作业()
{
Title=“开发者”
}
}
};
var clonedUser=users[0]。Clone();
clonedUser.Name=“我的更新名称”;
clonedUser.Job.Title=“图形设计师”//这行不通
Console.WriteLine(用户[0].Name);
Console.WriteLine(用户[0].Job.Title);
Console.ReadLine();
}
}
公共类用户
{
公共字符串名称{get;set;}
公共作业作业{get;set;}
公共用户克隆()
{
返回(用户)this.MemberwiseClone();
}
}
公开课工作
{
公共字符串标题{get;set;}
}

是否打算在不更改原始对象的情况下复制要修改的对象?您可以使用以下内容使
ReturnUser()
更简单:
返回this.Users.FirstOrDefault(x=>x.Id==Id)你的问题是什么?是的,这就是我想做的@matt然后看
class Program
{
    static void Main(string[] args)
    {
        var users = new List<User>()
        {
            new User()
            {
                Name = "My Name",
                Job = new Job()
                {
                    Title = "Developer"
                }
            }
        };

        var clonedUser = users[0].Clone();

        clonedUser.Name = "My Updated Name";
        clonedUser.Job.Title = "Graphic Designer"; //This Won't Work

        Console.WriteLine(users[0].Name);
        Console.WriteLine(users[0].Job.Title);
        Console.ReadLine();
    }
}

public class User
{
    public string Name { get; set; }
    public Job Job { get; set; }

    public User Clone()
    {
        return (User) this.MemberwiseClone();
    }
}

public class Job
{
    public string Title { get; set; }
}