C# 如何在C中比较字符串和枚举#
当我使用C# 如何在C中比较字符串和枚举#,c#,.net,C#,.net,当我使用.Equals时,它是参考比较,当我使用=时,它意味着值比较 是否有更好的代码代替将枚举值转换为ToString()进行比较?因为它破坏了值类型enum的用途,而且enum上的ToString()也不推荐使用???您可以解析字符串值并进行enum比较 Enum.TryParse:请参阅 如果您只是比较单个值: Name result; if (Enum.TryParse(myname, out result)) { switch (result) { ca
.Equals
时,它是参考比较,当我使用=
时,它意味着值比较
是否有更好的代码代替将枚举值转换为
ToString()
进行比较?因为它破坏了值类型enum的用途,而且enum上的ToString()
也不推荐使用???您可以解析字符串值并进行enum比较
Enum.TryParse:请参阅
如果您只是比较单个值:
Name result;
if (Enum.TryParse(myname, out result))
{
switch (result)
{
case Name.John:
/* do 'John' logic */
break;
default:
/* unexpected/unspecialized enum value, do general logic */
break;
}
}
else
{
/* invalid enum value, handle */
}
一种解决方案是获取枚举的类型,然后获取类型名称
Name result;
if (Enum.TryParse(myname, out result) && result == Name.John)
{
/* do 'John' logic */
}
else
{
/* do non-'John' logic */
}
您可以使用该方法将字符串转换为等效的枚举值(假设存在):
我想您正在寻找
Enum.Parse()
方法
Name myName;
if (Enum.TryParse(nameString, out myName))
{
switch (myName) { case John: ... }
}
如果您使用.NET4或更高版本,则可以使用。并可用于.NET2及更高版本
if(myname.Equals(Enum.Parse(Name.John)) //returns false
{
}
出于某种原因,给出的解决方案对我来说并不合适。我不得不用一种完全不同的方式:
// .NET2 and later
try
{
switch (Enum.Parse(typeof(Names), myName))
{
case John: ...
case Peter: ...
}
}
// .NET4 and later
Name name;
if (Enum.TryParse(myName, out name))
switch (name)
{
case John: ...
case Peter: ...
}
Name我的名字;
if(Enum.TryParse(nameString,out myName))
{
开关(myName){case John:…}
}
希望它能帮助某些人:)为什么要将字符串与枚举值进行比较?有没有办法完全避免这种情况?尝试将枚举与字符串进行比较是个坏主意。@SecurityHound在处理其他代码库时,这通常是不可避免的。这比比较每个枚举的
ToString()
值要好得多。:)MyEnumValue.ToString()有什么不好的地方?@Heinzlmaen-ToString()可以工作,但是您会多次比较两个字符串(对于每个枚举)-nameString.Equals(JohnEnum.ToString())。你可能会有大写/小写等错误。使用Enum.TryParse可以使用switch语句,这在我看来更干净,如果必须转换为小写等。您只需要在Enum.TryParse(nameString.ToLowerInvariant(),out myName))中执行一次。这是一个错误,在您编辑答案之前,我无法重做。很抱歉
if(myname.Equals(Enum.Parse(Name.John)) //returns false
{
}
// .NET2 and later
try
{
switch (Enum.Parse(typeof(Names), myName))
{
case John: ...
case Peter: ...
}
}
// .NET4 and later
Name name;
if (Enum.TryParse(myName, out name))
switch (name)
{
case John: ...
case Peter: ...
}
Name myName;
if (Enum.TryParse<Name>(nameString, out myName))
{
switch (myName) { case John: ... }
}