Почему сравнение значения DateTime со значением DateTime считается недопустимым приведением?

У меня есть этот код для сравнения двух значений DateTime:

DateTime currentWeek = Convert.ToDateTime(comboBoxWeekToSchedule.SelectedValue);
List<Student> thisWeeksStudents = (List<Student>)studentsList.Where(i => i.WeekOfLastAssignment.Equals(currentWeek));

Наиболее подходящим членом класса Student для этого обсуждения является:

public DateTime WeekOfLastAssignment { get; set; }

После этой строки:

DateTime currentWeek = Convert.ToDateTime(comboBoxWeekToSchedule.SelectedValue);

... выполняется, значение "currentWeek" равно "22.02.2016 00:00:00"

Я пытаюсь отфильтровать общий список для элементов, чей элемент «WeekOfLastAssignment» соответствует значению «currentWeek»; они представлены (в отладчике) как "{8/14/2015 22:52:55"

IOW, они, похоже, имеют одинаковый формат (за исключением включения «{» и «}», что, я сомневаюсь, является проблемой).

Я вижу, что точных совпадений может и не быть, так как значения поля со списком всегда имеют полночь в качестве элемента времени. Так что, возможно, мне придется выполнить операцию LINQ типа «LIKE%» (может быть, «Содержит»?), но первая проблема заключается в том, чтобы обойти это недопустимое приведение.

Это точный текст ошибки, которую я получаю после попытки присвоения общему списку с именем «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://stackoverflow.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;
}

person B. Clay Shannon    schedule 18.02.2016    source источник
comment
твой studentsList это List<Student> или это object?   -  person Ian    schedule 18.02.2016
comment
Возможно, студенческие объекты в studentsList нельзя преобразовать в Student. Что произойдет, если вы получите доступ к одному элементу studentsList по индексу и попытаетесь привести его к типу Student?   -  person khargoosh    schedule 18.02.2016
comment
Поскольку предложение where возвращает итератор, вам, вероятно, следует использовать ToList() как studentsList.Where(i => i.WeekOfLastAssignment.Equals(currentWeek)).ToList()   -  person bkdev    schedule 18.02.2016


Ответы (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)
person devuxer    schedule 18.02.2016