LINQ & Enumeration

本文关键字:Enumeration amp LINQ | 更新日期: 2023-09-27 18:20:10

我有这个枚举

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
}

LINQ & Enumeration

static public bool IsLightFile(string fileName)
{
  //Use any with names returned from the enum.
   return Enum.GetNames(typeof(LightFiles)).Any(w => w == fileName);    
}

有点不确定你到底在问什么,我可以看到三种可能性。。。

如果你只想让文件名包含任何枚举字符串,你可以这样做:

    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;
    }

或者,如果你说filename必须完全等于enum的值,你可以这样做:

    static public bool IsLightFile(string fileName)
    {
        return Enum.IsDefined(typeof(LightFiles), fileName);
    }

显然,您需要进行null检查,使字符串比较不区分大小写,等等。

static public bool IsLightFile(string fileName)
    {
      var extension = Path.GetExtension(fileName).Remove(0, 1);
      return Enum.GetNames(typeof(LightFiles)).Any(enumVal => string.Compare(enumVal, extension, true) == 0);
    }

我不明白你为什么要在这里使用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始终区分大小写,而文件扩展名通常被视为不区分大小写。

public bool IsLightFile(string filename)
{
    return Enum.GetNames(typeof(LightFiles)).Contains(
        Path.GetExtension(filename).Remove(0, 1).ToUpper());
}

LINQ在其中发挥作用的唯一方法是Enumerable.Contains()扩展方法。

另请参阅:

枚举.GetNames()
Path.GetExtension()
String.Remove()
String.ToUpper()