c# - 从 Calllog 计算并发调用数

标签 c# .net algorithm

有一个调用列表,包括开始时间、停止时间、持续时间、调用者和其他一些属性。现在我尝试从这个列表中可视化并发调用,但我不知道如何开始这个任务。我想在 .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 行的数据表,每行是一个具有属性的调用 start ItemArray[1](对于开始时间),stop ItemArray[2](对于停止时间),日期 ItemArray[0] 和其他一些属性,例如来电号码...

现在我得到了一个按分钟计算通话次数的桶。但是我如何将 callsBuckets 的类型转换为类似 Enumerable<dateTime,int> 的类型?

最佳答案

类似下面的内容应该可以帮助您入门。 这会从给定的开始时间创建分钟窗口(涵盖一整天,每小时 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 .

关于c# - 从 Calllog 计算并发调用数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7280973/

相关文章:

php - 你将如何在没有循环的情况下重写它?

c# - 与 ADFS 2.0 联合时如何正确设置超时

c# - 通过属性设置 Treeview HierarchicalDataTemplate

c# - 没有可用的公共(public)构造函数 Unity.Exceptions.InvalidRegistrationException

c# - EF5 逆属性问题

c# - StringBuilder 和 CommaDelimitedStringCollection 哪个更高效

.net - 如何不为种子实体设置 DatabaseGenerateOption.Identity

c# - 类型化数据集可为空的日期值有问题

algorithm - O(nk) 和 O(n+k) 在时间复杂度上有什么区别?

python - 精确变化算法