Переключение оператора с использованием string.contains

У меня есть следующий метод

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

Я хочу сделать рефакторинг оператора if внутри цикла foreach, используя оператор switch, так как мне нужно проверять различные слова

Тем не менее, я изо всех сил стараюсь использовать оператор switch из-за использования .Contains() и для факта мне нужно проверить каждое из моих имен файлов, которые могут иметь или не иметь определенный набор символов, которые я ищу.

Есть ли способ, которым я могу использовать оператор 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 ответа

Решение
switch(entity)
{
    case "test":

Только делает равное сравнение

Вам нужно будет использовать

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

Возможно, вы сможете создать метод, который возвращает функцию

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

Нет необходимости в отдельном условии, если вы хотите перебирать только те имена файлов, которые содержат "test",

Кроме того, как в сторону, призыв к ToString это излишне, это уже строка, я верю.

РЕДАКТИРОВАТЬ:

Этот вопрос, похоже, значительно изменился. Я оставлю свой ответ, но сейчас он, вероятно, устарел.

Вы можете использовать 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;
}
        if (Directory.Exists(rootFolder))
        {
            try
            {
                string[] valid = { "Test", "OtherTest" };

                foreach (string f in Directory.GetFiles(rootFolder))
                {
                    if (valid.Any(v => f.ToString().Contains(v)))
                    {
                        // create file
                    }
                }
            }
            catch
            {
                // log stuff
            }
        }
    }

Если вы добавите все ваши действительные строки в массив, часть linq "valid.Any(v => f.ToString().Contains(v)" просто проверит, равен ли ваш f.ToString () какому-либо из них, а не необходимость создания нескольких операторов if

Другие вопросы по тегам