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