首先我有这个foreach循环通过用户词典。 'int'值是一个订单列表(“ControlNumber”)。
foreach (KeyValuePair<string, int> e in errorOrders)
{
//finds error percentage for user
errPercentage = GetErrPercentage(e.Key);
Console.WriteLine("Percentage of errors for " + e.Key + ": " + Math.Round(errPercentage, 2) * 100 + "%");
//finds orderPerHour for user
ordersPerHour = OrdersPerHour(e.Key);
//Selects random orders for user based on errPercentage, saves to DT "randomOrders"
RandomOrders = RandomSelect(errPercentage, e.Key);
Console.WriteLine("Number of orders pulled : " + RandomOrders.Rows.Count);
//Print out orders randomly collected
for (int i = 0; i < RandomOrders.Rows.Count; i++)
{
Console.WriteLine(RandomOrders.Rows[i]["ControlNumber"]);
}
Console.WriteLine("\r\n");
//Creates class and fills class for each user
FillUserListClass(RandomOrders);
}
以下部分是FillUserListClass函数。这就是我遇到麻烦的地方。马上, 我在下面函数的最后一行收到一个错误(“对象引用未设置为对象的实例。”)。它试图将“ControlNumber”添加到UserList [username]类。
现在,我愿意接受有关更改此功能的建议。基本上,我想为每个用户创建一个Class,并且在这个类中保存一个List,其中包含每个用户的“ControlNumbers”。
我有人试图用LINQ做这个,但因为那些东西在我脑海中,我无法解决它。 (如果你认为这是最好的方法,我也会把LINQ代码放在这里)
public static void FillUserListClass(DataTable dt)
{
Dictionary<string, List<int>> UserList = new Dictionary<string, List<int>>();
{
foreach (DataRow row in dt.Rows)
{
object value = row["ControlNumber"];
if (value == DBNull.Value)
{
row.Delete();
}
}
for (int ctr = 1; ctr <= dt.Rows.Count; ctr++)
{
var row = dt.Rows[ctr];
var userName = row["User"].ToString();
if (UserList.ContainsKey(userName))
{
UserList[userName].Add(Convert.ToInt32(row["ControlNumber"]));
}
else
{
UserList.Add(row["User"].ToString(), null);
UserList[userName].Add(Convert.ToInt32(row["ControlNumber"]));
}
}
}
如果您需要它,这是我要填写的用户类
public class User
{
private string _name;
public string UserName { get; set; }
public List<int?> ControlNumber { get; set; }
public User (string username)
{
_name = username;
}
public User()
{
}
}
答案 0 :(得分:2)
您看到此错误是因为您在字典中为null
插入了List<int>
值,然后立即尝试向其中添加项目。
尝试替换此
UserList.Add(row["User"].ToString(), null);
UserList[userName].Add(Convert.ToInt32(row["ControlNumber"]));
有了这个:
UserList.Add(userName, new List<int>());
UserList[userName].Add(Convert.ToInt32(row["ControlNumber"]));
甚至更好:
UserList.Add(userName, new List<int>() { Convert.ToInt32(row["ControlNumber"]) });