C# 林氏;列举
我有这个枚举C# 林氏;列举,c#,linq,enumeration,C#,Linq,Enumeration,我有这个枚举 public enum LightFiles { PNG, JPG, GIF, FLV, TIF, BMP, MP3, WAV, WMA, TXT, PDF, XML, DOC, XLS, DBF, SQL,
public enum LightFiles
{
PNG,
JPG,
GIF,
FLV,
TIF,
BMP,
MP3,
WAV,
WMA,
TXT,
PDF,
XML,
DOC,
XLS,
DBF,
SQL,
CSS,
HTM
}
我需要检测文件名是否有一个枚举。项并返回TRUE(如果是)
我想通过LINQ有一些解决方案。我真的不知道如何解决这个问题
有线索吗,伙计们
static public bool IsLightFile(string fileName)
{
// Needs some LINQ
}
有点不确定你到底在问什么,我可以看到三种可能性 如果只希望文件名包含任何枚举字符串,可以执行以下操作:
static public bool IsLightFile(string fileName)
{
foreach (var eVal in Enum.GetNames(typeof(LightFiles)))
{
if (fileName.Contains(eVal))
{
return true;
}
}
return false;
}
static public bool IsLightFile(string fileName)
{
foreach (var eVal in Enum.GetNames(typeof(LightFiles)))
{
if (Path.GetExtension(fileName).Equals(eVal))
{
return true;
}
}
return false;
}
或者,如果您想查看它是否以该扩展结束,您可以执行以下操作:
static public bool IsLightFile(string fileName)
{
foreach (var eVal in Enum.GetNames(typeof(LightFiles)))
{
if (fileName.Contains(eVal))
{
return true;
}
}
return false;
}
static public bool IsLightFile(string fileName)
{
foreach (var eVal in Enum.GetNames(typeof(LightFiles)))
{
if (Path.GetExtension(fileName).Equals(eVal))
{
return true;
}
}
return false;
}
或者,如果您说文件名
必须完全等于枚举
值,则可以执行以下操作:
static public bool IsLightFile(string fileName)
{
return Enum.IsDefined(typeof(LightFiles), fileName);
}
显然,您需要进行空检查,使字符串比较不区分大小写,等等
static public bool IsLightFile(string fileName)
{
//Use any with names returned from the enum.
return Enum.GetNames(typeof(LightFiles)).Any(w => w == fileName);
}
LINQ在这方面发挥作用的唯一方式是扩展方法
另见:
我不明白您为什么要在这里使用LINQ。要查看字符串是否是有效的枚举值,比循环使用
enum.GetNames
的结果(无论是显式还是隐式使用LINQ)更自然的解决方案是enum.TryParse
string fileExtension = Path.GetExtension(fileName);
if (fileExtension.StartsWith("."))
fileExtension = fileExtension.Substring(1);
LightFiles lightFile;
return Enum.TryParse(fileExtension, true, out lightFile);
注意:可选的
Enum.IsDefined
始终区分大小写,而文件扩展名通常被视为不区分大小写。是否希望它位于文件名的任何位置?还是只是分机?@JamesMichaelHare只是分机。感谢您的详细输入@JamesMichaelHare!(+1)谢谢!是的,我知道。但我想它应该是某种LINQ解决方案。为什么它必须是LINQ解决方案?您被告知专门对LINQ执行此操作吗?@DmitryBoyko:Contains()是一个LINQ扩展方法。或者你的意思是你必须把它当作LINQ表达式?如果是这样,为什么?@James Michael Hare嗯,我不想把所有的事情都临摹一遍,但我只是想知道是否有可能在LINQ&Enumeration周围玩。Dmitry,如果有人试图用螺丝刀钉住图片,有人给了他们一把锤子,他们是否应该说“但我想应该是螺丝刀解决方案”?事实上,您可以使用Enum.IsDefind()
来检查并避免使用Any()
。@JamesMichaelHare,这是真的,但使用任何我们可以控制的方法,例如,您测试混合案例Enum.IsDefind()将在您传递“dOC”时失败,但使用的是。Any(w=>w.ToLower()==fileName.ToLower())@SurjitSamra:非常正确,虽然您可以使用Contains()
来实现这一点,但是使用ToLower()
来进行字符串比较成本很高,可以使用Contains()
和stringcomparison.currentCultureInogoreCase
等。