解决 如何转换列表<string> values to Enum

Anburaj Marikkani.

新成员
加入
2020年7月29日
消息
2
编程经验
3-5
我试图隐瞒列表<>价值到枚举,但我失败了。

列表<string> lstDays = new List<string> { "Monday", "Tuesday ", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

需要枚举

C#:
枚举 lstDays
    {
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday,
        Sunday
    }

请帮忙吗?
 
最后编辑了主持人:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
如果您需要枚举,那么您必须声明枚举。你不转换任何东西 枚举 在运行时键入,超过您将任何内容转换为a 班级 或者 结构体。如果您需要这样的枚举,那么您的第二个代码段是您需要使用的。

当然, system.dayofweek.. 枚举已经存在,所以无需宣告自己的。

如果你所说的是你有一个枚举,你有一个列表 细绳s 包含来自该枚举的值的名称,并且您希望在两者之间转换,那么这是不同的。这 枚举.parse.Parse. 存在方法,例如,
C#:
var dayNames = new List<string> {"Monday", "Tuesday ", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
var dayValues = dayNames.Select(s => (DayOfWeek) Enum.Parse(typeof(DayOfWeek), s)).ToList();
或者,没有LINQ:
C#:
var dayNames = new List<string> {"Monday", "Tuesday ", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
var dayValues = new List<DayOfWeek>();

foreach (var dayName in dayNames)
{
    var dayValue = (DayOfWeek) Enum.Parse(typeof(DayOfWeek), dayName);

    dayValues.Add(dayValue);
}
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
As a quick aside, the old WinAPI and VB6 style of using Hungarian notation for identfiers is discouraged in the .NET world. So lstDays should simply be days.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
使用来自系统名称空间的enum dayofweek。然后创建一个列表<T> - 例如一周中列出:列表<DayOfWeek>尝试这样的东西:
C#:
            List<DayOfWeek> lDayOfWeek = new List<DayOfWeek> { DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday,
                DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday };
            foreach(Ldayofweek的日子日) 
            {
                if (day == Day.Monday || day == Day.Friday)
                    Debug.WriteLine($"It's {day}");

                if (day >= Day.Monday && day <= Day.Friday)
                    Debug.WriteLine($"{day} is a weekday");
                else
                    Debug.WriteLine($"{day} is a weekend");
            }
输出 :
C#:
It's Monday
Monday is a weekday
Tuesday is a weekday
Wednesday is a weekday
Thursday is a weekday
It's Friday
Friday is a weekday
Saturday is a weekend
Sunday is a weekend
然后,您可以使用比较运营商在Dayofweek当天使用比较。如果您想成为星期一的一周的第一天,请启动您的列表<DayOfWeek>星期天是第一天,就像我所做的那样。如果你想星期天成为你的第一天,那么周六是你列表中的第一个条目。

希望这可以帮助。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
然后,您可以使用比较运营商在Dayofweek当天使用比较。如果您想成为星期一的一周的第一天,请启动您的列表<DayOfWeek>星期天是第一天,就像我所做的那样。如果你想星期天成为你的第一天,那么周六是你列表中的第一个条目。
不起作用。我收到以下输出:
C#:
FirstDayIsMonday
Sunday is a weekend
It's Monday
Monday is a weekday
Tuesday is a weekday
Wednesday is a weekday
Thursday is a weekday
It's Friday
Friday is a weekday
Saturday is a weekend

FirstDayIsSunday
Saturday is a weekend
Sunday is a weekend
It's Monday
Monday is a weekday
Tuesday is a weekday
Wednesday is a weekday
Thursday is a weekday
It's Friday
Friday is a weekday

根据上面的Quote中的描述使用以下代码:
如引号中所述排列列表:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection.PortableExecutable;
using System.Threading;

namespace SimpleCS
{
    class Program
    {
        void ShowDays(List<DayOfWeek> daysOfWeek)
        {
            foreach(Dayofweek日子在dayoofweek)
            {
                if (day == DayOfWeek.Monday || day == DayOfWeek.Friday)
                    Console.WriteLine($"It's {day}");

                if (day >= DayOfWeek.Monday && day <= DayOfWeek.Friday)
                    Console.WriteLine($"{day} is a weekday");
                else
                    Console.WriteLine($"{day} is a weekend");
            }
            Console.WriteLine();
        }

        void FirstDayIsMonday()
        {
            Console.WriteLine(nameof(FirstDayIsMonday));
            List<DayOfWeek> daysOfWeek = new List<DayOfWeek> { DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday,
                DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday };

            ShowDays(daysOfWeek);
        }

        void FirstDayIsSunday()
        {
            Console.WriteLine(nameof(FirstDayIsSunday));
            List<DayOfWeek> daysOfWeek = new List<DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday, DayOfWeek.Monday,
                    DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday };

            ShowDays(daysOfWeek);
        }

        void Run()
        {
            FirstDayIsMonday();
            FirstDayIsSunday();
        }

        static void Main(string[] args)
        {
            new Program().Run();
        }
    }
}
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
只是为了澄清一些东西,除非您使用日期使用枚举的数值,否则我正在使用日期和daysofweek并不重要。但由于你似乎正在寻找日子的弦,那么这只是另一种方法。

DOCS一天: 日 Enum(System.Windows.Forms)

我不知道你在你的代码中完成了什么,但正如我写的那样,它对我来说很好。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
That's because 枚举 Day is not the same as 枚举 DayOfWeek
C#:
枚举 Day
{
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

enum DayOfWeek
{
    Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}

所以价值Dayofweek.sunday正在映射到Day.Monday。


 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
That's because 枚举 Day is not the same as 枚举 DayOfWeek
我已经指出了这一点。

第二。如何在列表中插入枚举的顺序决定了它们的迭代方式。你会注意到第一天跳过直到最后。除非您需要使用枚举的数量,否则我不会打扰它。它们通过名称不按索引进行比较。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
And changing the code in post #4 to consistently use instead of 日ofweek.:
一直使用日期而不是Dayofweek:
列表<Day> lDayOfWeek = new List<Day> { Day.Sunday, Day.Monday, Day.Tuesday,
                                      Day.Wednesday, Day.Thursday, Day.Friday, Day.Saturday };
foreach(Ldayofweek的日子日) 
{
    if (day == Day.Monday || day == Day.Friday)
        Debug.WriteLine($"It's {day}");

    if (day >= Day.Monday && day <= Day.Friday)
        Debug.WriteLine($"{day} is a weekday");
    else
        Debug.WriteLine($"{day} is a weekend");
}

生成以下输出:
C#:
星期日 is a weekend
It's Monday
Monday is a weekday
Tuesday is a weekday
Wednesday is a weekday
Thursday is a weekday
It's Friday
Friday is a weekday
Saturday is a weekend
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
你是争论语义:
C#:
            List<Day> lDayOfWeek = new List<Day> { Day.Wednesday, Day.Thursday, Day.Friday,
                Day.Saturday, Day.Sunday, Day.Monday, Day.Tuesday };
            foreach(Ldayofweek的日子日) 
            {
                if (day == Day.Monday || day == Day.Friday)
                    Debug.WriteLine($"It's {day}");

                if (day >= Day.Monday && day <= Day.Friday)
                    Debug.WriteLine($"{day} is a weekday");
                else
                    Debug.WriteLine($"{day} is a weekend");
            }
Output :
C#:
周三  is a weekday
Thursday is a weekday
It's Friday
Friday is a weekday
Saturday is a weekend
Sunday is a weekend
It's Monday
Monday is a weekday
Tuesday is a weekday
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
大声笑是什么重要的是你把它们放在名单中的顺序。天仍然可以映射到Daysofweek的日子。

如果我使用排序列表,我只会改变您在上面的方式。 ;)
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
是的,但在第12篇文章中通知"Wednesday"没有跳过,但在第4篇文章中你说列表中的第一个项目:"Sunday" would be skipped.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
是的,因为我改变了:
C#:
列表<DayOfWeek> lDayOfWeek = new List<DayOfWeek>
至 :
C#:
列表<Day> lDayOfWeek = new List<Day>
使用原始代码,它将跳过第一个条目并呼叫它。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
啊,所以这很有意思。正如我写下的那样,我假设在引擎盖下有一些东西导致第一个项目跳过,但没有跳过。实际上,它似乎是微软文档中的错误???

让我解释。在 日ofweek.system.dayofweek. 枚举的指数从星期日开始,它的指数是0:
C#:
[System.Runtime.InteropServices.ComVisible(true)]
    public enum DayOfWeek {
        Sunday = 0,
然而 system.windows.forms. 不持有相同的索引,它从星期一开始,给出它正在跳过第一个项目的错觉:
C#:
    public enum Day {
        Monday = 0,
参考 : 参考来源
参考 日ofweek. : 参考来源

正如您所看到的,这明显不同。虽然我盲目地假设微软只会在框架中只有一天作为枚举。我也认为 日ofweek. 也是一些继承的班级或结构 枚举。最初你会想到;好吧,我做了,所以我认为枚举只会被称为一次。但是在技术上指的是一周中的两枚枚举,这是一周中的一件事,应该持有同一索引并在同一天开始,以便两者的迭代 日sofweek. 会是一样的。只有在他们没有的同一天开始,这只会发生这种情况。我正在考虑将此提交为一个错误,或者以最好宣布它有缺陷或矛盾的代码。为什么?嗯,除非你在我通常这样做的参考文档的引擎盖下看起来,否则你永远不会知道为什么我的原码似乎有效。我正在附加一些代码样本来比较所有三种变体的输出。 :
C#:
            Debug.WriteLine("......... Checking DayOfWeek ..........");
            List<DayOfWeek> lDayOfWeek = new List<DayOfWeek> { DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday,
                DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday };
            foreach (DayOfWeek day in lDayOfWeek)
            {
                if (day >= DayOfWeek.Monday && day <= DayOfWeek.Friday)
                    Debug.WriteLine($"{day} is a weekday - indexed {(int)day}");
                else
                    Debug.WriteLine($"{day} is a weekend - indexed {(int)day}");
            }

            Debug.WriteLine(".........检查日..........");

            List<Day> lDay = new List<Day> { Day.Sunday, Day.Monday, Day.Tuesday,
                Day.Wednesday, Day.Thursday, Day.Friday, Day.Saturday };
            foreach (Day day in lDay)
            {
                if (day >= Day.Monday && day <= Day.Friday)
                    Debug.WriteLine($"{day} is a weekday - indexed {(int)day}");
                else
                    Debug.WriteLine($"{day} is a weekend - indexed {(int)day}");
            }

            Debug.WriteLine("......... Checking Day in DaysOfWeek [Causes incorrect results]..........");

            List<DayOfWeek> DOfWeek = new List<DayOfWeek> { DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Tuesday,
                DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday };
            foreach (Day day in DOfWeek)
            {
                if (day >= Day.Monday && day <= Day.Friday)
                    Debug.WriteLine($"{day} is a weekday - indexed {(int)day}");
                else
                    Debug.WriteLine($"{day} is a weekend - indexed {(int)day}");
            }
只有当跳伞运动员指出上面的P /#9时,枚举的顺序设置值,那就是让我想到检查引用,看看它是如何实际运作的。故事的寓意,将其写着,因为跳伞者已经在P /#11上完成或使用上面的第一或第二个变体之一而不是使用 日ofweek. 因为他们都宣布在不同的日子里开始。星期天和星期一,两天的起始索引都是零。

如果有人可以向我解释为什么这些emum是使用不同的日子来设置不同的日子,为什么其中一个人使用默认值,我很乐意知道。

编辑固定破碎的代码。
 
Last edited:

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
以下是上面代码产生的输出:
C#:
......... Checking DayOfWeek ..........
Sunday is a weekend - indexed 0
Monday is a weekday - indexed 1
Tuesday is a weekday - indexed 2
Wednesday is a weekday - indexed 3
Thursday is a weekday - indexed 4
Friday is a weekday - indexed 5
Saturday is a weekend - indexed 6
.........检查日..........
星期天是一个周末 - 索引6
Monday is a weekday - indexed 0
Tuesday is a weekday - indexed 1
Wednesday is a weekday - indexed 2
Thursday is a weekday - indexed 3
Friday is a weekday - indexed 4
Saturday is a weekend - indexed 5
......... Checking Day in DaysOfWeek [Causes incorrect results]..........
Monday is a weekday 0
Tuesday is a weekday 1
Wednesday is a weekday 2
Thursday is a weekday 3
Friday is a weekday 4
Saturday is a weekend - indexed 5
星期天是一个周末 - 索引6
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
don't use 日ofweek.
不,为什么有人这样做? :) 它们是包含不同的不同枚举 价值.
如果有人可以向我解释为什么这些emum是使用不同的日子来设置不同的日子,为什么其中一个人使用默认值,我很乐意知道。
如Day Enum所解释的那样,它由月份控制(System.Windows.Forms)使用。默认值由 仓雅典ar.firstdayofweek属性(system.windows.forms) 使用DefaultValue属性。控制执行此操作以获取系统默认值,它还侦听SystemEvents.UserPreferenceChanged以查看UserPreferenceCategory.Locale中的更改。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,901
地点
切萨皮克,va.
编程经验
10+
我希望在我们曾经在邪恶的帝国工作两年前的工作时,我希望我能记得与Michael Kaplan的完整谈话,我询问了两个枚举。我们俩都离开了公司,迈克尔也离开了这一存在的存在。 (安息吧,我的朋友。)他给我的解释的一部分是 @Johnh. had mentioned above regarding the use of the 枚举 for use with the MonthCalendar. But there was more to it because Microsoft's tendency is to let Default to either be 0, or -1. But in this case 日.Default is 7 rather the expected 0 or -1. There was something about choosing Monday to be 0 which made internationalization easier, as well as with the actual implementation of any kind of calendar, but I don't recall it right now.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
我将要读到你为约翰投掷的东西。我认为在框架中声明了两个枚举非常奇怪,它们都在不同的日子开始,导致索引不同。对不起,如果您同意此同意,您需要详细解释我,以便我可以理解它的推理。

这是我认为,如果您要写框架,则应通过从完全不同的日子开始对同一目的构建结构所声明的其他枚举的日子来声明一次,而不是更改这些枚举的索引。如果您需要更改值,那就是我们使用类,结构和覆盖等内容的原因您是否看过参考"under the hood" links John?

什么是与6的那天检查?
.........检查日..........
星期日 is a weekend - indexed 6
 
最佳 底部