1

まず、ユーザーの辞書を通過する 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] クラスに追加しようとする場所。

今、私はこの機能を変更するための提案を受け入れています。基本的に、各ユーザーのクラスを作成し、このクラス内に保持するのは、各ユーザーの「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"]));
                }
            }
}

必要な場合に備えて、ここに入力したい User クラスがあります

 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()
   {
   }

}
4

1 に答える 1

2

このエラーが表示されるのは、辞書に a の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"]) });
于 2013-06-03T22:33:06.460 に答える