我的应用程序允许客户手动指定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”等,这正是我计划做的事情。
如何使此代码更简单,易维护且更易于阅读?
答案 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 */ });