Почему сравнение значения DateTime со значением DateTime считается недействительным приведением?
У меня есть этот код для сравнения двух значений DateTime:
DateTime currentWeek = Convert.ToDateTime(comboBoxWeekToSchedule.SelectedValue);
List<Student> thisWeeksStudents = (List<Student>)studentsList.Where(i => i.WeekOfLastAssignment.Equals(currentWeek));
Наиболее подходящим членом студенческого класса к этой дискуссии является:
public DateTime WeekOfLastAssignment { get; set; }
После этой строки:
DateTime currentWeek = Convert.ToDateTime(comboBoxWeekToSchedule.SelectedValue);
... выполняется, значение "currentWeek" равно "22.02.2016, 12:00:00"
Я пытаюсь отфильтровать общий список для элементов, чей элемент "WeekOfLastAssignment" соответствует значению "currentWeek"; они представлены (как видно в отладчике) как "{14.08.2015 10:52:55 PM}"
Итак, похоже, что они имеют одинаковый формат (за исключением символов "{" и "}", которые, я сомневаюсь, являются проблемой).
Я вижу, что не может быть точных совпадений, так как значения в поле со списком всегда имеют полночь в качестве элемента времени. Поэтому, возможно, мне придется выполнить операцию LINQ типа "LIKE %" (может быть, "Contains"?), Но первая проблема - преодолеть это неверное приведение.
Это точный текст ошибки, которую я получаю после попытки присвоения универсальному списку с именем "thisWeeksStudents":
System.InvalidCastException was unhandled
HResult=-2147467262
Message=Unable to cast object of type 'WhereListIterator`1[AYttFMScheduler.Student]' to type 'System.Collections.Generic.List`1[AYttFMScheduler.Student]'.
Что мне нужно сделать, чтобы исправить эту ситуацию?
В случае, если это может быть уместно, comboBoxWeekToSchedule заполняется такими значениями:
private void PopulateComboBoxWithSchedulableWeeks()
{
int WEEKS_TO_OFFER_COUNT = 13;
List<String> schedulableWeeks = AYttFMConstsAndUtils.GetWeekBeginnings(WEEKS_TO_OFFER_COUNT).ToList();
BindingSource bs = new BindingSource();
bs.DataSource = schedulableWeeks;
comboBoxWeekToSchedule.DataSource = bs;
}
public static List<String> GetWeekBeginnings(int countOfWeeks)
{
// from http://stackru.com/questions/6346119/datetime-get-next-tuesday
DateTime today = DateTime.Today;
// The (... + 7) % 7 ensures we end up with a value in the range [0, 6]
int daysUntilMonday = ((int)DayOfWeek.Monday - (int)today.DayOfWeek + 7) % 7;
DateTime nextMonday = today.AddDays(daysUntilMonday);
List<String> mondays = new List<string>();
// Need all Mondays, even though 1st Monday is BR only
if (!IsAssemblyOrConventionWeek(nextMonday))
{
mondays.Add(nextMonday.ToLongDateString());
}
for (int i = 0; i < countOfWeeks; i++)
{
nextMonday = nextMonday.AddDays(7);
if (!IsAssemblyOrConventionWeek(nextMonday))
{
mondays.Add(nextMonday.ToLongDateString());
}
}
return mondays;
}
1 ответ
Если вы получаете ошибку...
Невозможно привести объект типа 'WhereListIterator
1[AYttFMScheduler.Student]' to type 'System.Collections.Generic.List
1 [AYttFMScheduler.Student]".
... проблема не в том, что он не может DateTime
к DateTime
это то, что он не может бросить WhereListIterator<T>
к List<T>
, Я думаю, что все, что вам нужно сделать, это использовать ToList()
вместо актерского состава, вот так:
List<Student> thisWeeksStudents = studentsList
.Where(i => i.WeekOfLastAssignment.Equals(currentWeek))
.ToList();
Для вашей проблемы Equals
утверждение никогда не будет истинным (из-за сравнения даты, которая всегда полночь, с датой, имеющей переменное время), попробуйте просто получить Date
компонент, как это:
.Where(i => i.WeekOfLastAssignment.Date == currentWeek)