LINQ&列举

时间:2012-01-13 17:21:28

标签: c# linq enumeration

我有这个枚举

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
}

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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

LINQ参与其中的唯一方法是Enumberable.Contains()扩展方法。

另见:

Enum.GetNames()
Path.GetExtension()
String.Remove()
String.ToUpper()

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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