C# 如何将列表中的对象作为值返回
我有一个道具列表用户,我想获得具有指定id的用户,而不获取对它的引用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
在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; }
}