使用string.contains切换语句

时间:2017-07-25 14:22:59

标签: c# string switch-statement

我有以下方法

public List<AvailableFile> GetAvailableFiles(string rootFolder)
{

     if (Directory.Exists(rootFolder))
     {

         try
         {
             foreach (string f in Directory.GetFiles(rootFolder))
             {
                if (f.ToString().Contains("test"))
                {

                     files = CreateFileList(f);
                }
            }
        }
        catch (System.Exception excpt)
        {
           // log stuff
        }
   }
   return files;
}

我想要做的是重构foreach循环中的if语句,使用switch语句,因为我需要检查各种不同的单词

但是,由于使用.Contains(),我很难将switch语句放入,而且我需要检查每个文件名,这些文件名可能有也可能没有特定的字符集I& #39;我正在寻找。

有没有办法可以使用switch语句,还是我坚持使用各种if语句?

编辑 也许我不清楚自己想要做什么。而且看起来如何去做这是非常基于意见的。下面是一个快速模拟我如何描绘这个

public List<AvailableFile> GetAvailableFiles(string rootFolder)
{
    if (Directory.Exists(rootFolder))
    {
        Log.Info("Checking folder: " + rootFolder + " for files");
        try
        {
            foreach (string f in Directory.GetFiles(rootFolder))
            {
                // the if statement is now removed into another method CreateFileList
                files = CreateFileList(f);                 
            }
        }
        catch (System.Exception excpt)
        {
            Log.Fatal("GetAvailableFiles failed: " + excpt.Message);
        }
    }
    return files;
}


// mock up 
private static List<AvailableFile> CreateFileList(string entity)
{
    List<AvailableFile> fileList = new List<AvailableFile>();

    // how I can do it
    if(entity.Contains("test"))
    {
        run process 1
    }
    else if (entity.Contains("run"))
    {
        run process 2
    }

    // the way I'd prefer to have it
    switch(entity)
    {
        case "test":
            run process 1
        break;
        case "run":
            run process 2
        break;
    }

    return fileList;
}

如果我需要使用多个if语句,我会,但我更喜欢使用开关。我目前可以用C#做​​什么?

4 个答案:

答案 0 :(得分:1)

{{1}}

如果将所有有效字符串添加到数组中,则linq部分“valid.Any(v =&gt; f.ToString()。Contains(v)”将检查您的f.ToString()是否等于任何字符串其中而不是必须创建多个if语句

答案 1 :(得分:1)

foreach (string f in Directory.GetFiles(rootFolder).Where(o => o.Contains("test")))
{
    // Code referencing 'f' here
}

如果您只想迭代包含"test"的文件名,则无需单独的条件。

另外,对ToString的调用是多余的,它已经是我认为的字符串了。

编辑:

这个问题似乎发生了重大变化。我会留下我的答案,但现在可能已经过时了。

答案 2 :(得分:1)

您可以使用LINQ遍历已有的列表,并检查给定字符串是否是该列表中某个现有单词的一部分。

using System.Linq;

public List<AvailableFile> GetAvailableFiles(string rootFolder, List<string> wordsToCompare)
{
    if (Directory.Exists(rootFolder))
    {
        try
        {
            foreach (string f in Directory.GetFiles(rootFolder))
            {
                if (wordsToCompare.Any(v => f.ToString().Contains(v)))
                {
                    // create file
                }
            }
        }
        catch
        {
        // log stuff
        }
    }
    return files;
}

答案 3 :(得分:1)

switch(entity)
{
    case "test":

只做同等比较

您需要使用

else if (entity.Contains("run"))

您可以创建一个返回函数的方法