Переключение оператора с использованием 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"))
Возможно, вы сможете создать метод, который возвращает функцию
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
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;
}