Почему сравнение значения 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 ответ

Решение

Если вы получаете ошибку...

Невозможно привести объект типа 'WhereListIterator1[AYttFMScheduler.Student]' to type 'System.Collections.Generic.List1 [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)
Другие вопросы по тегам