计算来自Calllog的并发呼叫

时间:2011-09-02 08:31:34

标签: c# .net algorithm

有一个Calls列表,包括starttime,stoptime,duration,caller和其他一些属性。现在我尝试从这个列表中可视化并发呼叫,但我不知道如何从这个任务开始。我想在.net C#中实现这个任务。

第一个想法是接受每个调用,并将其计数到每秒一个数组,然后我有一个数组,每秒计算一次调用,但我认为它不是那么好: - )

 class CallConcurrentCounterController
{
    static void Main(string[] args)
    {    
        var Calls = new ImportDataFromCSV();
        DataTable dataTable = Calls.GetDataTable(Path,Seperator);

        DateTime startTime = new DateTime(2011,07,01);            
        callsBucket(dataTable,startTime);            
    }
    public void callsBucket(DataTable Calls, DateTime startTime)
    {
        var callsBuckets =
            from time in Enumerable.Range(0, (60 * 24))
                .Select(i => startTime.AddMinutes(i)) // Create the times base on start time and current minute.                
            select new // Create an anonymous type
            {
                // Create a property called Time, that stores the time checked
                Time = time,
                // Another property that stores the number of calls happening at that time.
                //CallCount = Calls.Rows.Count(Call => Call.start <= time && Call.stop >= time)                    
                CallCount = Calls.AsEnumerable().Count
                    (Call => DateTime.Parse(Call.ItemArray[0].ToString() + " " + Call.ItemArray[1].ToString()) <= time && 
                             DateTime.Parse(Call.ItemArray[0].ToString() + " " + Call.ItemArray[2].ToString()) >= time)
            };
    }
}

从调用此函数的函数给出一个带有n行的DataTable,每行是一个具有Attributes start ItemArray [1]的调用(对于start-Time),停止ItemArray [2](对于stop-Time), Date ItemArray [0]和其他一些属性,如Caller-Number ...

现在,我得到了一个分钟计数呼叫的桶。但是我如何将callBuckets的类型转换为类似Enumerable的类型?

2 个答案:

答案 0 :(得分:2)

以下内容应该让您入门。 这会在给定的开始时间内创建微小窗口(覆盖整天,每小时60分钟,每天24小时)。

然后计算之前开始的所有呼叫,并在该时间之后结束。您可以将Count来电更改为Where,以保留每次发生的各个来电的详细信息。

var startTime = new DateTime.Today().AddDays(-1); //When to start the minute interval buckets
var callsBuckets =
    from time in Enumerable.Range(0, (60 * 24) // Minutes in a day
                           .Select(i => new DateTime(startTime).AddMinutes(i) // Create the times base on start time and current minute.
    select new // Create an anonymous type
    {
        // Create a property called Time, that stores the time checked
        Time = time,
        // Another property that stores the number of calls happening at that time.
        CallCount = Calls.Count(Call => Call.StartTime <= time && Call.StopTime >= time)
    };

现在您已经显示您正在使用DataTable,请参阅此问题的已接听答案:LINQ query on a DataTable

答案 1 :(得分:1)

您需要首先编写一个方法来确定两个DateTime范围是否重叠。一旦该方法有效,只需在列表中查找具有最多重叠次数的呼叫。或者,如果您需要确定在特定时间的呼叫次数,只需编写一个方法来检查该范围是否涵盖此时间值,并在您的呼叫列表上执行Count()