2

我有一个从 CosmosDB 中的更改源中读取的“id”字符串。每条记录都是版本化的,因此每当记录更新时,旧记录将被版本化以包含时间戳,并且将添加新记录。

例子:

id: productbase-001.11

得到更新

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

我要做的是获取类型(productbase),然后获取itemId(001.11)并获取时间戳(2020-03-30)。我只需要时间戳,因为我想从我的处理逻辑中进一步排除旧记录。

 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 来获取这些,那么我会全力以赴。

4

2 回答 2

3

使用带参数的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 个项目,因此整个时间戳将作为最后一个数组项目(如果存在)包含在内。

于 2020-03-31T15:58:40.623 回答
0

有多种方法可以处理这个问题。这里有一对:

如果您不需要时间戳的特定值,您可以检查是否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})?$

对我来说,使用命名组非常清楚,但有些人可能认为这种解决方案有点过头了。

如果是我,我也会将所有这些逻辑放入它自己的类(例如ProcessedItemId)或至少一个静态方法中,以便它可以在其他地方重用。

于 2020-03-31T16:05:22.563 回答