2011-09-02 84 views
3

有一个呼叫列表,包括starttime,stoptime,duration,caller和其他一些属性。现在我试着从这个列表中看到并发呼叫,但是我不知道如何开始这个任务。我想在.net C#中实现这个任务。计数来自Calllog的并发呼叫

的第一个想法就是把每个呼叫,它算到一个Array,每一秒,然后我有一个数组至极计数呼吁每一秒,但它不是那么好,我认为:-)

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每行都是一个带有属性的调用start ItemArray [1](用于启动时间),停止ItemArray [2](用于停止时间),日期ItemArray [0]和其他一些属性,如呼叫者号码...

现在我得到一个桶分钟计数的电话。但我怎么能将CallBuckets的类型转换为类似Enumerable的类型?

回答

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

+0

对变量使用大写字母令人困惑。 – Amy

+0

更正的外壳 –

+0

嗨乔治,我测试你的代码,但得到一些错误,我用Calls读取CSV并将其写入到一个名为“Calls”的DataTable中,然后使用参数初始化函数:调用startTime stopTime并在里面写入Code ,但我得到一个错误,没有接受DataRowCollection的函数Count。 – kockiren

1

您需要先编写一个方法来确定两个DateTime范围是否重叠。一旦该方法正常工作,只需在列表中查找具有最多重叠次数的呼叫。或者,如果您需要确定在特定时间的电话号码,只需编写一个方法来检查范围是否覆盖此时间值,然后在您的电话列表中执行Count()

+0

你能解释我如何检查两个DateTime Vars的范围重叠吗? – kockiren

+0

就像这样:'私人布尔相交(int r1start,诠释r1end,诠释r2start,诠释r2end) { return(r1start == r2start)|| (r1start> r2start?r1start <= r2end:r2start <= r1end); }' –