Итак, я запросил базу данных, чтобы создать коллекцию под названием «деятельность», и это звонки, которые имеют связанный вопрос и связанную дату. Мне нужно вернуть первые три вопроса, заданные, если дата активности составляет 0-3 месяца, 4-12 месяцев или более года. Я создал алгоритм, но для целей обучения я подумал, что может быть лучший способ эффективно сортировать эти действия. Это мой код
var activities = ctx.Activities.Where(a => a.SiteID == propID && a.ActivityTypeName == "Call" && a.ParcelData.Parcel_LetterTracking.LMailDate != null)
.Select(x => new
{
callDate = x.DateTimeEntry,
mailDate = x.Contact.OwnerContact.ParcelDatas.FirstOrDefault(a => a.OwnerContactID == x.Contact.OwnerContact.OOwnerID).Parcel_LetterTracking.LMailDate,
question = x.FAQs.FirstOrDefault(a => a.ActivityID == x.ActivityID).FAQ_Library.FaqNum + " - " +
x.FAQs.FirstOrDefault(a => a.ActivityID == x.ActivityID).FAQ_Library.Question
}).AsEnumerable();
// create a dictionary of Key = the question and Value = the count of occurences in activities for each time frame.
Dictionary<string, int> calls3month = new Dictionary<string, int>();
Dictionary<string, int> calls6month = new Dictionary<string, int>();
Dictionary<string, int> calls12month = new Dictionary<string, int>();
// counters for number of calls between each range
int numberOfCalls3Months = 0;
int numberOfCalls4to6Months = 0;
int numberOfCalls12Months = 0;
foreach (var call in activities)
{
// if calldate - maildate is 3 months, 4-12 months or 12+ months
TimeSpan deltaOfDates = call.callDate.Subtract((DateTime)call.mailDate);
if (deltaOfDates.Days < 91 && deltaOfDates.Days > 0)
{
if (calls3month.TryGetValue(call.question, out int count))
{
calls3month[call.question] = count + 1;
}
else {
calls3month.Add(call.question, 1);
}
numberOfCalls3Months++;
}
else if (deltaOfDates.Days < 365 && deltaOfDates.Days >= 91)
{
if (calls6month.TryGetValue(call.question, out int count))
{
calls6month[call.question] = count + 1;
}
else
{
calls6month.Add(call.question, 1);
}
numberOfCalls4to6Months++;
}
else if (deltaOfDates.Days >= 365)
{
if (calls12month.TryGetValue(call.question, out int count))
{
calls12month[call.question] = count + 1;
}
else
{
calls12month.Add(call.question, 1);
}
numberOfCalls12Months++;
}
}
//grab top 3 questions asked. Key = the question, value = the frequency
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();
Было бы быстрее отсортировать их, когда я перечисляю в коллекции действий? Если (dictionary.value находится в топ-3, добавьте его в начало списка) Какую стратегию я мог бы использовать для этого?
В конце, когда я использую orderbyDescending, я чувствую, что это неэффективно, и словари должны быть отсортированы, выходя из цикла foreach /