【问题标题】:How to add object to in to List如何将对象添加到列表中
【发布时间】:2023-03-31 20:53:01
【问题描述】:

我有以下代码,

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

标签: c# list generic-list


【解决方案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 ActiveUser{UserId=-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(); 
    

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2019-05-29
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      相关资源
      最近更新 更多