Как повторно использовать переменную Regex? - PullRequest
2 голосов
/ 11 февраля 2020

Есть ли способ перезаписать значение переменной типа Regex?

У меня есть рабочий код, который выглядит следующим образом:

string[] dirEntries = Directory.GetFiles(inputDir, "*.csv", SearchOption.TopDirectoryOnly);
var fileList = dirEntries
   .Select(x => new FileMetaDto 
      {
         FileName = Path.GetFileName(x),
         FullPath = x,
         FileType = fileType,
      });
switch (fileType)
  {
  case "pd":  // probability of default
    Regex myRegexPD = new Regex("^PD_"); // probability of default
    fileList = fileList.Where(x => myRegexPD.IsMatch(x.FileName));
    break;
  case "fx":  // exchange rate
    Regex myRegexFx = new Regex("^FX_"); // exchange rate
    fileList = fileList.Where(x => myRegexFx.IsMatch(x.FileName));
    break;
  default:
    System.Diagnostics.Debug.WriteLine("File type not valid.");
    break;
}

На самом деле это выражение switch гораздо длиннее, поэтому я хотел бы сократить его, выполнив что-то вроде следующего:

my Regex myRegex = new Regex();
switch (fileType)
  {
  case "pd":
    myRegex = "^PD_";
    break;
  case "fx":
    myRegexFx = "^FX_";
    break;
  default:
    System.Diagnostics.Debug.WriteLine("File type not valid.");
    myRegEx = "*";
    break;
}
fileList = fileList.Where(x => myRegex.IsMatch(x.FileName));

Однако это приводит к различным ошибкам преобразования типов. Любое предложение, как справиться с этим?

Ссылки

1 Ответ

4 голосов
/ 11 февраля 2020

Я предлагаю организовать шаблоны в словарь и избавиться от switch ... case:

 //TODO: I've hardcoded the patterns, but you may well want to generate them:
 // s_Patterns = MyFileTypes.ToDictionary(t => t.Name, $"^{t.Name.ToUpper()}_"); 
 private static Dictionary<string, string> s_Patterns = new Dictionary<string, string>() {
   {"pd", "^PD_"},
   {"fx", "^FX_"},
 };

, тогда вы можете легко использовать их:

 if (s_Patterns.TryGetValue(fileType, out var pattern))
   fileList = fileList.Where(x => Regex.IsMatch(x.FileName, pattern));
 else
   System.Diagnostics.Debug.WriteLine("File type not valid.");
...