在目录中搜索遵循特定命名约定的文件的好方法是什么?

时间:2015-10-07 20:27:08

标签: c#

我的应用程序允许客户手动指定80个图像,稍后将使用。但是,我还提供自动查找和加载这些图像文件的功能,只要它们遵循特定的命名约定。

例如,这些文件的命名约定如下:

*ClientName*_*ImageName*.png

仅允许PNG文件,ImageName是应用程序定义的名称集。 ClientName被忽略,因为它是客户端定义的。

我正在添加更多图片,并意识到我目前的处理方式并不可行。

目前,我获取指定目录中具有PNG扩展名的所有文件。

然后,我的代码如下(例子):

if (StringContains(currFile, "Tree"))
{
    // assign image "Tree"
}
else if (StringContains(currFile, "Bush"))
{
    // assign image "Bush"
}

...etc

我的StringContains函数只执行String.IndexOf(currFile, StringComparison.CurrentCultureIgnoreCase),如果结果为>= 0则返回true。

这种方法的第一个问题是无穷无尽的if / else if语句。这是不可控制的。

第二个问题是,如果我有一个名为TreeMaple的图像。我现在需要更改我的if语句以找到“Tree”图像:

if (StringContains(currFile, "Tree") && !StringContains(currFile, "Maple"))

你可以想象当你添加更多图像名称时会有多疯狂,例如“TreeMapleFall”,“TreeMapleWinter”,“TreeMapleWinterSnow”等,这正是我计划做的事情。

如何使此代码更简单,易维护且更易于阅读?

1 个答案:

答案 0 :(得分:2)

有些事情可能更容易:

string pattern = @"[^_]+_([^_]+)\.png";  // Regex pattern to capture *ImageName*
Regex regex = new Regex(pattern);
Match match = regex.Match(currFile);
if (match.Success)                       // If image abides by the format
{
    switch (match.Value) {               // Switch on the *ImageName*
        case "Tree":
            // Logic
            break;
        case "Bush":
            // Logic
            break;
        case "Maple":
            // Logic
            break;
    }
}

或使用代表:

Dictionary<string, Action> imageActions = new Dictionary<string, Action>();
if (match.Success && imageActions.ContainsKey(match.Value))   // If image abides by the format and a delegate exists for handling that image name
    imageActions[match.Value]();

// usage
imageActions.Add("Tree", () => { /* Logic */ });