switch()语句,带有string.contains()作为参数

时间:2018-01-22 10:53:23

标签: c# dictionary if-statement switch-statement

我对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语句或字典来做这件事?

3 个答案:

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