2015-10-06 2 views
2

Привет Я рассматриваю лучший способ обновления одной коллекции на основе другой коллекции.Обновите одну коллекцию, основанную на другом значении коллекции

Сначала система соответствует пользователю как полностью доступная, а затем получает доступность из системы для обновления коллекции. Первая коллекция нуждается в обновлении со значениями из второй коллекции. Это работает, но медленно.

var currentDate = DateTime.Now; 

// setup as fully available 
var listAvailabilityNotBooked = new List<Availability>(); 

for (int i = -2; i < 10; i++) 
{ 
    listAvailabilityNotBooked.Add(new Availability 
    { 
     Month = currentDate.AddMonths(i).Month, 
     Year = currentDate.AddMonths(i).Year, 
     Percentage = 0 
    }); 
} 

// match booked up from system 
var availability = _availabilityRepository.GetAll(); 
foreach (Availability notBooked in listAvailabilityNotBooked) 
{ 
    // not booked becomes booked if match in system 
    notBooked.Percentage = 
     availability.Where(i => i.Month == notBooked.Month && i.Year == notBooked.Year) 
      .Select(i => i.Percentage).FirstOrDefault(); 
} 

var availabilityDetail = new AvailabilityDetail 
{ 
    Availability = listAvailabilityNotBooked, 
    EmailEnquiryForm = new EmailEnquiryForm() 
}; 

Я переработан в:

  • это необходимо для поиска как на месяц и
  • года по-прежнему медленно на нескольких данных добавить месяц и где пункт
var currentDate = DateTime.Now; 

// match booked up from system 
IQueryable<Availability> availability = _availabilityRepository.GetAll(); 

// setup as fully available 
List<Availability> availabilityBooked = new List<Availability>(); 

for (int i = -2; i < 10; i++) 
{ 
    var month = currentDate.AddMonths(i).Month; 
    var year = currentDate.AddMonths(i).Year; 

    availabilityBooked.Add(new Availability 
    { 
     Month = month, 
     Year = year, 
     Percentage = availability.Where(a => a.Month == month && a.Year == year) 
      .Select(a => a.Percentage).FirstOrDefault() 
    }); 
} 
+0

Совету, рекомендуется использовать фактическое имя типа, а не «var» (например, "var listAvailabilityNotBooked = новый Список <Доступность>();" должен быть «Список <Доступность> listAvailabilityNotBooked = новый Список <Доступность>();". На всякий случай вы получите множество переменных с разными типами, но схожими именами^_^ – Rariolu

+0

Мне нужно показать за два месяца до текущей даты и в будущем доступность - если в системе не нужно использовать процент по умолчанию 0% – matt

+1

@Rariolu: Кто сказал, что это хорошая практика? На самом деле многие считают «вар» хорошей практикой и гораздо более удобочитаемыми. На самом деле это всего лишь вопрос личного предпочтения и стиля кодирования. –

ответ

2

Я хотел бы использовать Lookup<Tkey, TValue> чтобы быстро найти процент за каждый месяц:

var monthPercentageLookup = _availabilityRepository.GetAll() 
    .ToLookup(x => new{ x.Year, x.Month }, x => x.Percentage); 
foreach (Availability notBooked in listAvailabilityNotBooked) 
{ 
    var month = new { notBooked.Year, notBooked.Month }; 
    notBooked.Percentage = monthPercentageLookup[month].FirstOrDefault(); 
} 
+0

привет, мне нужно искать по месяцу и году для процента – matt

+0

@Matt: и это то, что я сделал, я использовал анонимный тип, который содержит год и месяц. –

Смежные вопросы