Как вы находите нужную дату из одного из значений словаря?

#c# #dictionary #datetime

#c# #словарь #дата и время

Вопрос:

Как следует из названия, как вы находите нужную дату из одного из значений словаря, которое является временем даты?

Я много раз пытался найти такую дату, но там говорилось, что дата не найдена, даже если она находится в одном из значений!

Что делать?

 public static void ListAllSalesByDate()
{
   int orderCount = 0;
   double totalCount = 0;

   DateTime input;

   int id = 0;

   Console.Write("Enter the date: ");
   if (DateTime.TryParse(Console.ReadLine(), out input))
   {
      foreach (KeyValuePair<int, Sale> sale in sales)
      {
         if (sale.Value.Today == input)
         {
            id = sale.Key;

         }
      }
      if (sales.ContainsKey(id))
      {

         for (int i = 0; i <= sales.Count; i  )
         {
            orderCount  ;

            Console.WriteLine("nOrder(s) Found for {0}!n", input.ToString("MM/dd/yyyy"));

            Console.WriteLine("Order ID:  Total:");
            Console.WriteLine("=========  =======");
            Console.WriteLine($"{sales[id].OrderID:D5}  {sales[id].Finaltotal:C}");

            totalCount  = sales[i].Finaltotal;

            Console.WriteLine($"{orderCount} order(s) found for a total of {totalCount:C} on {sales[id].Today}");
         }
      }
      else
      {
         Console.WriteLine($"nthe date of {input.ToString("MM/dd/yyyy")} was not found. Try again.n");
      }
   }
   else
   {
      Console.WriteLine($"nthe date of {input.ToString("MM/dd/yyyy")} was not found. Try again.n");
   }
}
 

Комментарии:

1. Компонент даты да

2. Попробуйте удалить временную часть либо полностью, либо столько, сколько вам подходит. Фрактоны секунды сделают ужасные ключи для поиска! перед заполнением словаря!

3. Проблема, вероятно, в том, что sale.Value.Today возвращает текущую дату, вы должны использовать: sale.Value.Date .

4. У вас есть два случая, которые завершаются the date of {input.ToString("MM/dd/yyyy")} was not found . Что попадает под удар? Ответ на вопрос будет меняться в зависимости от этого

5. Еще в отчете о продажах If. Содержит ключ

Ответ №1:

Предполагая, что вы хотите сравнить только компонент даты a DateTime и хотите KeyValuePair , просто используйте FirstOrDefault

Возвращает первый элемент последовательности, который удовлетворяет условию или значению по умолчанию, если такой элемент не найден.

 var result = sales.FirstOrDefault(x => x.Value.Date == input.Date);

if(result != null)
{
   // you have found the dictionary entry
   var id = result.Key;
   ...
}
else
{
   // not found
}
 

Если может быть более одной совпадающей даты, вы можете использовать Where

Фильтрует последовательность значений на основе предиката.

 var results = sales.Where(x => x.Value.Date == input.Date).ToList();

if(!results.Any())
{
   foreach(var entry in results)
   {
       var id = result.Key;
      ...
   }
}
else
{
   // not found
}