2013-05-03 122 views
0

我对自己的工作有点困惑,我似乎把我的问题弄得很复杂。C#多维数组

我正在将数据从呼叫拨号程序中拨出,此拨号程序记录所有座席的所有呼叫,并且每个座席都在队列中,同一队列中可以有多个座席。

我的SQL基本的计算,我可以拉日期,队列,时间以及每个小时的呼叫数如下所示:

callDate queueid cHour numberOfCalls 
2013-05-03 No Queue  0   1 
2013-05-03 No Queue  2   1 
2013-05-03 No Queue  6   1 
2013-05-03 No Queue  7   7 
2013-05-03 No Queue  8   6 
2013-05-03 No Queue  9   14 
2013-05-03 No Queue  10   6 
2013-05-03 No Queue  11   5 
2013-05-03 No Queue  12   8 
2013-05-03 17001  7   114 
2013-05-03 17001  8   238 
2013-05-03 17001  9   227 
2013-05-03 17001  10   190 
2013-05-03 17001  11   221 
2013-05-03 17001  12   73 
2013-05-03 17002  6   3 
2013-05-03 17002  7   125 

在那里,你可以看到队列,小时和多少电话那一小时(小时上午7点,上午8点...等)。

我需要知道,如果我创建一个多维数组来存储每个小时的队列,小时和每个队列的调用次数(如果这样做有道理?),以便我可以稍后将它用作图形?

这里是我得到卡住了我的示例代码:

的XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:DV="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
    xmlns:DVC="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
    xmlns:ThemeManager.ThemeName="MetropolisDark" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 

    <DVC:Chart Name="Chart" 
       Background="#463F3F">     
     <DVC:Chart.PlotAreaStyle> 
      <Style TargetType="Grid"> 
       <Setter Property="Background" Value="Transparent" /> 
      </Style> 
     </DVC:Chart.PlotAreaStyle> 
    </DVC:Chart> 

</Grid> 

C#:

private void AllAgentHourData() 
    { 
     string[] queueid = new string[100]; 
     int[] callHour = new int[100]; 
     int count = 0; 
     int counter = 0; 

     SqlConnection sqlConnection1 = new SqlConnection("Server=nl-reportserver;Database=RC_Dailer_WH;User Id=sa;[email protected]@.001"); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader reader; 

     //cmd.CommandText = "SELECT * FROM RC_call_logs WHERE convert(date,call_logdate,120) = convert(date,GETDATE(),120)"; 
     cmd.CommandText = "Select distinct queueid from RC_call_logs order by queueid"; 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = sqlConnection1; 

     sqlConnection1.Open(); 

     reader = cmd.ExecuteReader(); 
     if (reader.HasRows) 
     { 
      while (reader.Read()) 
      { 
       queueid[count] = reader.GetString(0); 
      } 
     } 
     else 
     { 
      MessageBox.Show("No Error message"); 
     } 
     reader.Close(); 

     sqlConnection1.Close(); 

     Random random = new Random(); 

     //Chart is your chart object in Xaml 
     //declare your series 
     for (int i = 1; i < 10; i++) 
     { 
      LineSeries ls = new LineSeries(); 

      ls.Title = i.ToString(); 
      ls.IndependentValueBinding = new Binding("Key"); 
      ls.DependentValueBinding = new Binding("Value"); 

      ls.ItemsSource = new KeyValuePair<DateTime, int>[]{ 
      new KeyValuePair<DateTime,int>(DateTime.Now    , random.Next(1000)), 
      new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(1), random.Next(10, 1000)), 
      new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(2), random.Next(10, 1000)), 
      new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(3), random.Next(10, 1000)), 
      new KeyValuePair<DateTime,int>(DateTime.Now.AddMonths(4), random.Next(10, 1000))}; 

      // then add it to the chart 
      Chart.Series.Add(ls); 
     } 

    } 
+0

请仔细阅读http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title – 2013-05-03 12:22:46

+0

感谢,但我不知道该怎么这个词,因此长问题 – Silentdarkness 2013-05-03 12:25:48

+2

不要对任何东西使用多维数组。 – Jodrell 2013-05-03 12:30:48

回答

1

我真的不知道是什么你正在努力实现,但是这样的事情可能会有所帮助。

Dictionary<DateTime, Dictionary<string, KeyValuePair<int,int>>> dicData 

日期时间是你的日期时间,字符为您的队列和INT,INT在KeyValuePair是小时numberOfCall对。

编辑1:

实际上却是KeyValuePair列表。这里有一个例子:

Dictionary<DateTime, Dictionary<string, List<KeyValuePair<int, int>>>> dicData = new Dictionary<DateTime, Dictionary<string, List<KeyValuePair<int, int>>>>(); 
     //dt is your result from SQL query 
     foreach (DataRow dr in dt.Rows) 
     { 
      DateTime dtm = DateTime.Parse(dr["DateTime"].ToString()); 
      string queue = dr["Queue"].ToString(); 
      int hours = int.Parse(dr["Hours"].ToString()); 
      int cycles = int.Parse(dr["Cycles"].ToString()); 

      //Adding Distinct DateTime objects as Key 
      if(!dicData.ContainsKey(dtm)) 
      { 
       dicData[dtm] = new Dictionary<string, KeyValuePair<int, int>>(); 
      } 

      //Adding distinct Queue object as Key under the DateTime dictionary 
      if (!dicData.ContainsKey(queue)) 
      { 
       dicData[dtm][queue] = new List<KeyValuePair<int, int>>(); 
      } 
      dicData[dtm][queue].Add(new KeyValuePair<int, int>(hours, cycles)); 
     } 
+0

这会工作,你能为我提供以外的答案,帮我一个实际的例子这将是我第一次使用这个,但使得sence。 – Silentdarkness 2013-05-03 12:32:40

+0

我该如何声明dt? – Silentdarkness 2013-05-03 12:48:38

+0

DataTable dt = new DataTable(); 您可以用SqlDataAdapter填充它可以说:“da”通过: da .Fill(dt); – Xelom 2013-05-03 12:50:32

0

编辑

所以,在你的阅读while循环,你可以做,

while (reader.Read()) 
{ 
    var callHour = new CallHour(
     DateTime.ParseExact("yyyy-mm-dd", reader.GetString(0)), 
     reader.GetInt32(2), 
     reader.GetInt32(3), 
     reader.IsDBNull(1) ? null : reader.GetInt32(1)); 

    callHours.Add(callHour.Time, callHour); 
} 

做一个类,你可以把它CallHour那么你可以有一些通用的收集CallHour。该通用集合将支持IEnumerable<CallHour>并可能支持IList<CallHour>


public class CallHour 
{ 
    private readonly DateTime time; 

    public CallHour(
      DateTime day, 
      int hour, 
      int callCount, 
      int? queueId = null) 
    { 
     this.hour = new DateTime(
      day.Year, 
      day.Month, 
      day.Day, 
      hour, 
      0, 
      0, 
      0); 

     this.CallCount = callCount; 
     this.QueueId = queueId; 
    } 

    public DateTime Time 
    { 
     get 
     { 
      return this.time; 
     } 
    } 

    public int? QueueId { get; set; } 
    public int CallCount { get; set; } 
}  

然后,你可以声明一个排序的列表,并添加您的第一个小时。

var callHours = new SortedList<DateTime, CallHour>(); 

var someCallHour = new CallHour(
    DateTime.Parse("2013-05-03 00:00:00"), 0, 1); 

callHours.Add(someCallHour.Time, someCallHour);