Как добавить объект в список

#c# #list #generic-list

#c# #Список #общий список

Вопрос:

У меня есть следующий код,

 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.Коллекции.Generic.ListActiveViewUser>’ to ‘Lib.DataView.ActiveViewUser’. Что я здесь сделал не так. как я могу это исправить?

Комментарии:

1. Посмотрите на Intellisense на .Add() вы найдете там свою проблему

2. 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 ActiveUser{UserId=-1, UserName="AllUsers", FirstName="All"}
return status;
  

Ответ №2:

Вы можете попробовать материализовать (т. Е. создать) status с помощью Linq из записей top и body:

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