#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
}