如何将对象添加到列表中
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 => x.FirstName));
【参考方案1】:
添加需要列表类型的单个元素,现在代码正在尝试添加整个列表(newli)而不是该列表的每个单个对象。
这应该在状态列表中插入 newli 列表的所有元素
status.AddRange(newli);
List<T>
类还有一个 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();
【讨论】:
以上是关于如何将对象添加到列表中的主要内容,如果未能解决你的问题,请参考以下文章
Power Query:当特定值出现在另一列中时如何将一个添加到列中