如何将对象添加到列表中

Posted

技术标签:

【中文标题】如何将对象添加到列表中【英文标题】:How to add object to in to List 【发布时间】:2020-09-09 19:23:03 【问题描述】:

我有以下代码,

public List<ActiveViewUser> GetAllActiveUsers(int branchId)

List<ActiveViewUser> status = new List<ActiveViewUser>();
DataSet ds = DataAccessManager.ExecuteStoredProcedure("spGetAllActiveUsers", parameters);
// add an all user option to the list
ActiveViewUser allusr = new ActiveViewUser();
List<ActiveViewUser> allActiveusers = new List<ActiveViewUser>();
allusr.UserId = -1;
allusr.UserName = "AllUsers";
allusr.FirstName = "All";
status.Add(allusr);


foreach (DataRow dr in ds.Tables[0].AsEnumerable())

    ActiveViewUser usr = new ActiveViewUser();

    usr.UserId = dr["UserId"].ToString().Length == 0 
      ? 0 
      : Convert.ToInt32(dr["UserId"].ToString());

    usr.UserName = dr["UserName"].ToString();
    usr.FirstName = dr["FirstName"].ToString();
    allActiveusers.Add(usr);

var newli = allActiveusers.OrderBy(x => x.FirstName).ToList();
status.Add(newli); //Error occurred in this line


根据上面的代码,我需要先插入All 作为第一个索引,其他所有活动用户都需要在用户的FirstName 之后插入。所以我尝试了上面的查询。它返回以下错误。

无法从“System.Collections.Generic.List”转换为“Lib.DataView.ActiveViewUser”。我在这里做错了什么。我该如何解决这个问题?

【问题讨论】:

查看.Add() 上的 Intellisense,您会在那里找到您的问题 status.AddRange(allActiveusers.OrderBy(x =&gt; x.FirstName)); 【参考方案1】:

添加需要列表类型的单个元素,现在代码正在尝试添加整个列表(newli)而不是该列表的每个单个对象。

这应该在状态列表中插入 newli 列表的所有元素

status.AddRange(newli); 

List&lt;T&gt; 类还有一个 InsertTo 方法,允许将元素插入到特定位置。所以你甚至可以用

简化代码
status = new List<ActiveUser>();
foreach (DataRow dr in ds.Tables[0].AsEnumerable())

    ActiveViewUser usr = new ActiveViewUser();
    usr.UserId = dr["UserId"].ToString().Length == 0 ? 0 : Convert.ToInt32(dr["UserId"].ToString());
    usr.UserName = dr["UserName"].ToString();
    usr.FirstName = dr["FirstName"].ToString();

    // Add directly to the status list....
    status.Add(usr);

// Order the status list and reassign the result to the same list
status = status.OrderBy(x => x.FirstName).ToList();

// Finally insert at position 0 the "AllUsers" user.
status.InsertTo(0, new ActiveUserUserId=-1, UserName="AllUsers", FirstName="All"
return status;

【讨论】:

【参考方案2】:

您可以在 Linq 的帮助下从顶部和正文记录中尝试 materialize(即创建)status

// Top record(s)
var allusr = new ActiveViewUser[] 
  new ActiveViewUser() 
    UserId    = -1,
    UserName  = "AllUsers",
    FirstName = "All",
   
;

// Body records
var newli = DataAccessManager
  .ExecuteStoredProcedure("spGetAllActiveUsers", parameters)
  .Tables[0]
  .AsEnumerable()
  .Select(dr => new ActiveViewUser() 
     UserId    = dr["UserId"] == DBNull.Value ? 0 : Convert.ToInt32(dr["UserId"]), 
     UserName  = Convert.ToString(dr["UserName"]),
     FirstName = Convert.ToString(dr["FirstName"]),
   )
  .OrderBy(x => x.FirstName);

// Top and Body combined:
List<ActiveViewUser> status = allusr
  .Concat(newli)
  .ToList(); 

【讨论】:

以上是关于如何将对象添加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用R [list]将列表的名称插入到列中

如何将 Telerik 网格列绑定到作为列表的子数据对象?

Power Query:当特定值出现在另一列中时如何将一个添加到列中

如何将mysql内部连接结果从行分组到列

Pandas 将具有多个值的行数据合并到列的 Python 列表中

css 将边界半径添加到列