有一个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的类型?
答案 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()