C # пересекаются два списка строк с рисунком - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть два списка таких строк:

var entities= new List<string>(){"101", "102", "103",}; 
var files= new List<string>(){"101_F05_20101001.csv", "102_F05_20101001.csv", "201_F05_20101001.csv", "202_F05_20101001.csv"};

Я хочу получить результат их пересечения, следуя этой схеме:

ID_F05_YYYYMMDD.csv

ГдеИдентификатор должен соответствовать одному или нескольким элементам в списке объектов.

Я написал следующий код:

var list = files
    .Where(x => entities.Any(y => x.Contains(y) && x.Substring(0, y.Length) == y))
    .ToList();

Рабочий код здесь .

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

var regex = new Regex(@"^(\d*)_F05_\d*\.csv$");

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я решил использовать немного больше linq для решения этой проблемы:

        var entities = new List<string>() { "101", "102", "103", };
        var files = new List<string>() { "101_F05_20101001.cvs", "102_F05_20101001.cvs", "201_F05_20101001.cvs", "202_F05_20101001.cvs" };
        var regex = new Regex(@"^(\d*)_F05_\d*\.cvs$");

        var result = entities.SelectMany(e => files.Select(f =>
        {
            var match = regex.Match(f);
            if (match.Success)
            {
                if (match.Groups.Count > 1)
                {
                    if (match.Groups[1].Value == e) return f;
                }
            }

            return "";
        })).Where(s => !String.IsNullOrEmpty(s));
0 голосов
/ 28 февраля 2019

Вы можете использовать

.Where(x => Regex.IsMatch(x, $@"^(?:{string.Join("|", entities)})_F05_\d*\.csv$"))

Регулярное выражение будет выглядеть как ^(?:101|102|103)_F05_\d*\.csv$ с учетом ваших текущих входных данных и будет соответствовать

  • ^ - начало строки
  • (?:101|102|103) - группа без захвата, которая соответствует 101, 102 или 103
  • _F05_ - буквенная строка
  • \d* - 0или более цифр
  • \.csv - .csv строка
  • $ - конец строки

Обратите внимание, что вам не нужно регулярное выражение экранировать entities если они числовыеИначе, вам нужно использовать string.Join("|", entities.Select(Regex.Escape)).

C # код демо :

var entities= new List<string>(){"101", "102", "103",}; 
var files= new List<string>(){"101_F05_20101001.csv", "102_F05_20101001.csv", "201_F05_20101001.csv", "202_F05_20101001.csv"};

var pat = $@"^(?:{string.Join("|", entities)})_F05_\d*\.csv$";

var list = files
        .Where(x => Regex.IsMatch(x, pat))
        .ToList();

foreach (var s in list) {
    Console.WriteLine(s);
}

Вывод:

101_F05_20101001.csv
102_F05_20101001.csv
...