Найти предикат DayOfWeek Issue c # - PullRequest
0 голосов
/ 24 апреля 2018

В последнее время я столкнулся с проблемой, когда пытался найти определенный день в списке DayOfWeek, он не работает хорошо в воскресенье, но работает во все остальные дни.

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

пример:

namespace testing1
{
    public partial class Timer : Form
    {
        public static List<dayOfWeek> day = new List<dayOfWeek>();//I can set things in it

        public Timer()
        {
            InitializeComponent();
        }

        private void Timer_Load(object sender, EventArgs e)
        {
                Console.WriteLine(day.Count); //return 0 when I instantiate the form without inserting from an another form.

                checkBox1.Checked = day.Find((dayOfWeek d) => { return d == dayOfWeek.Monday; }) == dayOfWeek.Monday; // return false OK
                checkBox2.Checked = day.Find((dayOfWeek d) => { return d == dayOfWeek.Tuesday; }) == dayOfWeek.Tuesday; // return false OK
                checkBox3.Checked = day.Find((dayOfWeek d) => { return d == dayOfWeek.Wednesday; }) == dayOfWeek.Wednesday; // return false OK
                checkBox4.Checked = day.Find((dayOfWeek d) => { return d == dayOfWeek.Thursday; }) == dayOfWeek.Thursday; // return false OK
                checkBox5.Checked = day.Find((dayOfWeek d) => { return d == dayOfWeek.Friday; }) == dayOfWeek.Friday; // return false OK
                checkBox6.Checked = day.Find((dayOfWeek d) => { return d == dayOfWeek.Saturday; }) == dayOfWeek.Saturday; // return false OK
                checkBox7.Checked = day.Find((dayOfWeek d) => { return d == dayOfWeek.Sunday; }) == dayOfWeek.Sunday; // return true WTF ????
        }
    }
}

Могу ли я получить помощь?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Перечисления являются типами значений, а метод расширения Find имеет следующий режим при обработке списков с этим типом типа (цитата из MSDN):

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

0 голосов
/ 24 апреля 2018

DayOfWeek является enum, поэтому это тип значения, переменные типа значения не могут иметь нулевое значение, если только они не помечены как Nullable<>, это означает, что, скорее всего, первое значение в DayOfWeek enum равно Sunday , которое будет значением по умолчанию, поэтому всякий раз, когда Find не может найти это значение, в этом случае возвращается значение по умолчанию Sunday .

Вместо этого следует использовать Contains:

day.Contains(DayOfWeek.Sunday);
//..
...