我对C#
有点新,我试图创建一个switch
方法,返回与给定文件名对应的ID(int
)。< / p>
例如:
var fileName = "file-example_MAP_COPY.xml";
var fileTypeId = GetFileTypeId(fileName); // Returns 3310
使用GetFileTypeId
方法看起来像这样:
private GetFileTypeId(string fileName)
{
switch(string.Contains(fileName))
{
case ".xsd":
return 3010;
case "_Gui.xml":
return 3120;
case ".xml":
return 3300;
case "_MAP_COPY.xml":
return 3310;
...
}
}
我无法修剪实际的文件名,只保留扩展名,因为文件名可能包含下划线。名为&#34; example_1_MAP_COPY.xml &#34;的文件将修剪为&#34; _1_MAP_COPY.xml &#34;如果在第一个下划线处修剪,则会导致文件扩展名错误。
if
语句可以在这里使用,但由于我有18种不同的情况,我想找到另一种解决方案,而不是写18 if
语句。
我是否有某种方式可以用switch
语句或字典来做这件事?
答案 0 :(得分:5)
您确实可以使用switch
,但似乎您只使用字符串的结尾,因此您可以使用其他列表类型来保存模式及其结果:
var l = new []
{ new { Pattern = ".xsd", Value = 3010 }
, new { Pattern = "_MAP_COPY.xml", Value = 3310 }
};
foreach (var p in l)
{
if (filename.EndsWith(p.Pattern))
{
return p.Value;
}
}
// not found
答案 1 :(得分:4)
在当前的C#中,你可以这样做:
switch(filename) {
case string s when s.Contains(".xsd"): // or EndsWith, etc
...
}
我不是说这是最好的方法,或者它在if
/ else if
上添加了任何内容,但是......它有效。
在18个复杂case
语句与18个if
语句之间做出选择并不多;除了if
方法不要求你在任何地方添加break;
,并且不会泄漏案例之间的变量声明。
就个人而言,我会使用if
/ else if
- 或匹配/结果对的静态数组:
static readonly (string Match, int Result)[] MatchResults = new[] {
(".xsd", 3010),
("_Gui.xml", 3120),
// ...
};
...
foreach(var pair in MatchResults) {
if(filename.Contains(pair.Match)) return pair.Result;
}
答案 2 :(得分:1)
您确实可以使用开关,但似乎您只使用字符串的结尾,因此您可以使用我认为更简单的字典:
private readonly Dictionary<string, int> _ids = new Dictionary<string, int>
{
{".xsd", 3010},
{".xml", 3300},
{"_Gui.xml", 3120},
{"_MAP_COPY.xml", 3310}
};
private int GetFileTypeId(string fileName)
{
var element = _ids.FirstOrDefault(_ => fileName.Contains(_.Key));
return element.Value;
}