如何从列表中返回对象作为值

时间:2019-11-22 21:58:40

标签: c# list

我有一个道具List Users,我想获得具有指定ID的User,而无需获取对其的引用。
在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);

4 个答案:

答案 0 :(得分:1)

如果您的User对象仅包含原始属性,则可以添加以下方法:

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();

}

如果您的用户包含复杂的类型属性,并且您不希望这些属性仅用作引用,则必须实现深层复制

The fine manual有足够多的话要说和一些很好的例子

答案 1 :(得分:1)

如果您只想参加第一场比赛,首先使用FirstOrDefault()而不是Where()

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

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

答案 2 :(得分:0)

我认为AsNoTracking()可能是您想要的方式。

public User ReturnUser(int id)
{
    return this.Users.AsNoTracking().FirstOrDefault(x => x.Id == id);
}

此链接提供有关AsNoTracking()的更多信息,但以上内容可以实现您想要实现的目标。

What difference does .AsNoTracking() make?

答案 3 :(得分:0)

尝试此操作,但是请注意,仅当您的用户对象仅包含基本类型(例如int,double,bool和不包含引用类型)时,此方法才有效。

有关Deep Copy / Deep Clone,请参见this

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