2013-06-03 2 views
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"를 포함하는 List가됩니다.

누군가 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"])); 
       } 
      } 
} 

은 고객이 필요로 여기에 내가 채우려는 내 사용자 클래스 (당신이 갈 수있는 가장 좋은 방법이라고 생각한다면, 나는 또한 최대 여기에 LINQ 코드를 넣을 수 있습니다)

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

} 

답변

2

List<int>에 대해 null 값을 사전에 삽입 한 다음 바로이 항목을 추가하려고했기 때문에이 오류가 표시됩니다.

에 한번이이

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"]) }); 
관련 문제