C# 如何在c中在列表中存储多个项

C# 如何在c中在列表中存储多个项,c#,asp.net,.net,C#,Asp.net,.net,我正在获取一个用户详细信息列表,并将一些详细信息存储到另一个列表中,然后返回该列表,但问题是最终返回的行数正确,但每行的值与最后一行的值相同 GetUserList usr = new GetUserList(); List<GetUserList> UsersList = new List<GetUserList>(); List<users> lstusers= usersBase.GetUsersListByOrgId(OrgId, null); tr

我正在获取一个用户详细信息列表,并将一些详细信息存储到另一个列表中,然后返回该列表,但问题是最终返回的行数正确,但每行的值与最后一行的值相同

GetUserList usr = new GetUserList();
List<GetUserList> UsersList = new List<GetUserList>();
List<users> lstusers= usersBase.GetUsersListByOrgId(OrgId, null);

try
{
    if (lstusers.Count > 0)
    {
        usr.Message = "Success";

        for (int i = 0; i < lstusers.Count; i++)
        {
            usr.UserID = Convert.ToInt32(lstusers[i].userID);
            usr.UserFirstName = Convert.ToString(lstusers[i].forename);
            UsersList.Add(usr);

            //return usr;
        }
    }
    else
    {
        usr.Message = "Failed";
    }

    return UsersList;
}
catch (Exception e)
{
    throw e;
}

只需将usr的声明/实例化移动到循环中:

for (int i = 0; i < lstusers.Count; i++)
{
    GetUserList usr = new GetUserList();
    usr.UserID = Convert.ToInt32(lstusers[i].userID);
    usr.UserFirstName = Convert.ToString(lstusers[i].forename);
    UsersList.Add(usr);

    //return usr;
}

否则,您将一直向列表中添加对同一GetUserList实例的引用,并覆盖其值-因此,您最终得到的结果是,每一行的值都与最后一行的值相同。

您必须在for循环中实例化对象,当前同一对象多次存储在列表中,更改代码如下:

for (int i = 0; i < lstusers.Count; i++)
{
   GetUserList usr = new GetUserList(); // not this line
   usr.Message = "Success";
   usr.UserID = Convert.ToInt32(lstusers[i].userID);
   usr.UserFirstName = Convert.ToString(lstusers[i].forename);
   UsersList.Add(usr);


}

当前,您每次都在修改同一对象,因此结果将是所有列表项中最后更新的内容。

因为您每次都在循环迭代中更新同一用户,并一次又一次地添加到列表中。 每次循环迭代时都应该创建一个新用户

GetUserList usr ;
List<GetUserList> UsersList = new List<GetUserList>();
List<users> lstusers= usersBase.GetUsersListByOrgId(OrgId, null);



try
{
    if (lstusers.Count > 0)
    {


        for (int i = 0; i < lstusers.Count; i++)
        {
            //create a new instance of user here
            usr = new GetUserList();
            usr.Message = "Success";
            usr.UserID = Convert.ToInt32(lstusers[i].userID);
            usr.UserFirstName = Convert.ToString(lstusers[i].forename);
            UsersList.Add(usr);


            //return usr;
        }
    }
    else
    {
        usr.Message = "Failed";
    }


    return UsersList;
}

catch (Exception e)
{
    throw e;
}

您正在将同一个GetUserList实例添加到列表中。在循环中,只为GetUserList类的一个实例更新字段usr.UserID usr.UserFirstName。因此,效果是假设lstusers.Count=10,则将该对象添加到列表中的时间为10次。Move GetUserList usr=new GetUserList;在循环内部,也使用usr.Message=。

每次都使用新的用户对象

GetUserList usr =null;
    List<GetUserList> UsersList = new List<GetUserList>();
    List<users> lstusers= usersBase.GetUsersListByOrgId(OrgId, null);



    try
    {
        if (lstusers.Count > 0)
        {
           // ;

            for (int i = 0; i < lstusers.Count; i++)
            {
                usr= new GetUserList();
                usr.Message = "Success"  
                usr.UserID = Convert.ToInt32(lstusers[i].userID);
                usr.UserFirstName = Convert.ToString(lstusers[i].forename);
                UsersList.Add(usr);


                //return usr;
            }
        }
        else
        {
            usr.Message = "Failed";
        }


        return UsersList;
    }

    catch (Exception e)
    {
        throw e;
    }

您试过调试代码吗?每次在循环中都需要创建一个新的GetUserList usr。在OOP中,对象是一个指向内存块的指针,您不断地向列表添加同一指针,并为同一指针设置一个新值,因此列表中的所有对象都具有相同的值。我想知道这个相同的问题被问了多少次,差异最小。。。