Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 林氏;列举_C#_Linq_Enumeration - Fatal编程技术网

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
等。