簡體   English   中英

C#多維數組

[英]C# Multidimensional Arrays

我對自己的工作有些困惑,似乎使我的問題變得復雜了。

我正在從呼叫撥號程序中提取數據,該撥號程序記錄所有座席的所有呼叫,每個座席都在一個隊列中,同一隊列中可以有多個座席。

我在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;Password=d@t0r@.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);
        }

    }

我不確定您要達到的目標,但是這樣可能會有所幫助。

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

DateTime是您的DateTime,字符串是您的Queue和int,KeyValuePair中的int是hour和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));
        }

編輯

因此,在閱讀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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM