Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有更有效的方法对这些词典进行排序_C#_Sorting_Data Structures - Fatal编程技术网

C# 有没有更有效的方法对这些词典进行排序

C# 有没有更有效的方法对这些词典进行排序,c#,sorting,data-structures,C#,Sorting,Data Structures,所以我查询了一个数据库来创建一个名为“活动”的集合,这些调用都有相关的问题和相关的日期。如果活动日期为0-3个月、4-12个月或一年以上,我需要返回前三个问题。我创建了一个算法,但出于学习目的,我认为可能有更好的方法来有效地对这些活动进行排序。这是我的密码 var activities=ctx.activities.Where(a=>a.SiteID==propID&&a.activitytytypename==“Call”&&a.ParcelData.Parcel\u letterracki

所以我查询了一个数据库来创建一个名为“活动”的集合,这些调用都有相关的问题和相关的日期。如果活动日期为0-3个月、4-12个月或一年以上,我需要返回前三个问题。我创建了一个算法,但出于学习目的,我认为可能有更好的方法来有效地对这些活动进行排序。这是我的密码


var activities=ctx.activities.Where(a=>a.SiteID==propID&&a.activitytytypename==“Call”&&a.ParcelData.Parcel\u letterracking.LMailDate!=null)
.选择(x=>new
{                 
callDate=x.DateTimeEntry,
mailDate=x.Contact.OwnerContact.ParcelDatas.FirstOrDefault(a=>a.OwnerContactID==x.Contact.OwnerContact.OOwnerID)。包裹\u LetterTracking.LMailDate,
问题=x.FAQs.FirstOrDefault(a=>a.ActivityID==x.ActivityID).FAQ\u Library.FaqNum+“-”+
x、 FAQ.FirstOrDefault(a=>a.ActivityID==x.ActivityID).FAQ\u Library.Question
}).AsEnumerable();
//创建关键=问题和价值=每个时间范围内活动发生次数的字典。
Dictionary calls3month=新字典();
Dictionary calls6month=新建Dictionary();
字典调用12个月=新建字典();
//每个范围之间的呼叫数计数器
int numberOfCalls3Months=0;
int numberofcalls 4到6个月=0;
int numberofcalls 12个月=0;
foreach(var调用活动)
{
//如果calldate-maildate为3个月、4-12个月或12个月以上
TimeSpan deltaOfDates=call.callDate.Subtract((DateTime)call.mailDate);
如果(deltaOfDates.Days<91&&deltaOfDates.Days>0)
{                       
if(calls3month.TryGetValue(call.question,out int count))
{
calls3month[call.question]=count+1;
}
否则{
调用3个月。添加(call.question,1);
}
电话号码3个月++;
}
else if(deltaOfDates.Days<365&&deltaOfDates.Days>=91)
{                     
if(调用6个月的TryGetValue(call.question,out int count))
{
通话6个月[call.question]=计数+1;
}
其他的
{
6个月通话添加(通话问题1);
}
通话次数4到6个月++;
}
否则如果(deltaOfDates.Days>=365)
{
if(调用12个月的TryGetValue(调用问题,out int count))
{
通话12个月[通话问题]=计数+1;
}
其他的
{
12个月通话添加(通话问题,1);
}
通话次数12个月++;
}
}
//抓取前三个问题。键=问题,值=频率
var topCalls3month=calls3month.OrderByDescending(kvp=>kvp.Value).Take(3.ToArray();
var topCalls6month=calls6month.OrderByDescending(kvp=>kvp.Value).Take(3.ToArray();
var topCalls12month=calls12month.OrderByDescending(kvp=>kvp.Value).Take(3.ToArray();
当我在activities集合中列举时,对它们进行排序会更快吗?如果(dictionary.value位于前3位,则将其添加到列表顶部) 我可以用什么策略来做到这一点

最后,当我使用orderbyDescending时,我觉得这是低效的,应该从foreach循环中对字典进行排序

您可以通过在生成的字典上运行a来避免排序(即,
orderbyDescending
)。是一种O(n)算法,它比排序渐进地更有效。您可能会在网上找到很多实现


另一个问题是,使用选择算法是否真的足够快而令人担忧。即使数组包含一百万个项目,选择算法和排序之间的差异也可能不到一秒钟。你真的在乎你是否能快几毫秒得到答案吗?

不看任何细节,我认为你可以做并行处理。对于(0,activities.Length,(I)=>{/*Do checks…*/});使用ConcurrentDictionary不会影响性能,但您可以简化块以增加count
calls6month[call.question]=calls6month.GetValueOrDefault()+1有时候最好通过db查询来完成。@Terryson我考虑过,但我需要不同列表中的不同日期。是否有一种方法可以将它们组织在一个查询中(而不是三个查询)?如果我必须使用.Where进行3次查询(日期时间为3个月/6个月/12个月),效率会不会降低?除非您有数百万条记录,否则此函数中的性能瓶颈将是sql查询。代码可读且足够干净,可以保持原样,直到您开始发现明显的性能问题。