Как разбить строку C# на переменную, если отметка времени является необязательной? - PullRequest
2 голосов
/ 31 марта 2020

У меня есть строка "id", которую я читаю из ленты изменений в CosmosDB. Каждая запись имеет версии, поэтому при обновлении записи старая версия будет содержать метку времени, и будет добавлена ​​новая запись.

Пример:

id: productbase-001.11

GETS ОБНОВЛЕНО

id: productbase-001.11 <- new record
id: productbase-001.11-2020-03-30 <- old record

Что я хочу сделать, это получить тип (productbase), затем получить itemId (001.11) и получить метку времени (2020-03-30). Мне нужна только временная метка, потому что я хочу исключить старые записи из моей логики обработки c дальше вниз.

 foreach (ProcessedItem item in changes)
 {
   var convert = item.id.Split('-');
   string itemType = convert[0];
   string itemId = convert[1];
   string timestamp = convert[2];

   if (timestamp != null)
   {
       return;
   }
   else
   {
       [rest of my code]
   }
}

Очевидно, что проблема будет иметь нулевые ссылки, а также наличие "-" в качестве разделителя будет означать, что я получу «2020» и «03» и «30» как отдельные элементы в массиве. Также не уверен, насколько медленным это будет, если у меня будет 3000 обновлений.

Если есть лучший способ получить их, используя SQL API, тогда я весь в ушах.

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Используйте перегрузку String.Split , которая принимает параметр count

var convert = item.id.Split(new char[]{'-'}, 3);
string itemType = convert[0];
string itemId = convert[1];
string timestamp = (convert.Length == 3 ? convert[2] : null);

Поскольку мы указали максимум 3 элемента, тогда вся отметка времени будет включена в качестве последний элемент массива, если имеется.

0 голосов
/ 31 марта 2020

Существует множество способов справиться с этим. Вот пара:

Если вам не нужно указывать c значение метки времени, вы можете просто проверить, есть ли в convert более двух элементов:

 foreach (ProcessedItem item in changes)
 {
     var convert = item.id.Split('-');
     string itemType = convert[0];
     string itemId = convert[1];

     if (convert.Length > 2)
     {
         return;
     }
     else
     {
         [rest of my code]
     }
 }

Это довольно неинвазивно для кода, который вы уже написали, но было бы непонятно, почему вы это делаете.

Другой вариант - использовать регулярное выражение . , что-то вроде:

^(?<Product>\w+)-(?<ItemNum>\d+\.\d+)-?(?<TimeStamp>\d{4}-\d{2}-\{2})?$

Для меня использование названных групп совершенно очевидно, но некоторые могут посчитать это решение излишним.

Если бы это был я, я бы также поместите всю эту логику c в свой собственный класс (например, ProcessedItemId) или, по крайней мере, в метод stati c, чтобы его можно было использовать в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...