C# - 使用标记来识别值的子字符串总和

Posted

技术标签:

【中文标题】C# - 使用标记来识别值的子字符串总和【英文标题】:C# - Substring sum using tokens to identify values 【发布时间】:2013-03-05 17:40:31 【问题描述】:

我想要实现的是以下。我有一个可以采用以下格式的字符串(只是一个示例,实际字符串可能是完全随机的):

01005010050

上面的字符串分为以下几个字段:

0 100 50 100 50

我想要实现的是将最后 4 个字段的总和放入第一个 0 字段。我确实有机会用标记或可用于识别字段在字符串中的位置的东西来装饰字符串,即

[£+]0[£-][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]

然后我会使用正则表达式从开始和结束标记中获取内部值。我需要一些方法来识别哪些字段是主字段,所以我打算使用另一个令牌:

[*][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]

然后我可以遍历找到的内部字符串,将它们转换并添加它们。然后在原始字符串上删除开始 [£+] 和结束 [£-] 标记并将 [*] 替换为计算的总数。我认为这可行,但问题在于每个字符串可能有多个总计。

[£+][*][£-][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]\r\n
[£+][*][£-][£+]100[£-][£+]50[£-][£+]100[£-][£+]50[£-]

所以我想在该字段中添加某种 ID:

ID1[*][£+]ID1|100[£-][£+]ID1|50[£-][£+]ID1|100[£-][£+]ID1|50[£-]\r\n
ID2[*][£+]ID2|100[£-][£+]ID2|50[£-][£+]ID2|100[£-][£+]ID2|50[£-]

那么您将使用正则表达式来拆分字符串。在管道 (|) 上拆分找到的内部字符串,这样第一个值将是键,第二个值是值。将所有这些添加到字典或其他东西中。然后,您必须遍历字典中的每个键并添加所有总数,从原始字符串中删除标记并将“Key[*]”替换为找到的该键的总数。

这个过程更加复杂,因为另一个字段可以保存总计。我只是想先澄清一下,这是一种合乎逻辑的方式,当有一个简单的解决方案时,我不会把事情复杂化。只是为了澄清字符串的格式可能是完全随机的,即

abc1000cde50 where fields are:
abc 100 0 c d e 50 (total placed in field 3 from 2 + 7)

我有机会装饰字段的原因是这个字符串是从一个 XML 文件构建的,我可以在其中有一个属性说明这是一个总字段,这是主字段。我不能在构建字符串时简单地添加值的原因是首先执行了许多其他计算,包括计算实际值是什么(即该字段在 0 - 500 的范围内)。我只是在返回完成的构建字符串之前计算最后的总数。代码的结构方式我失去了拆分字段的能力,因此放置标记以显示字段在字符串中的位置并能够以这种方式计算总数。

【问题讨论】:

你读过吗?! @AppDeveloper 根据他定义明确的问题,我认为他尝试了很多。 【参考方案1】:

只解决问题的第一部分!

假设您在 0 之后和某个 != 0 之前分割字符串:


    string s = "01005010050";

    var ls = new List<int>();

    for (int n = 0; n < s.Length - 1; n++)
    
        if ((int)s[n] == 48 && (int)s[n + 1] != 48) // 48 = Ascii(0)
        
            s = s.Insert(n + 1, ";");
        
    

    ls = s.Split(';').Select(Int32.Parse).ToList();

    for (int n = 1; n < ls.Count(); n++)
    
        ls[0] += ls[n];
    

【讨论】:

【参考方案2】:

您似乎将解决方案视为将输入字符串中的字段替换为其他计算字段的过程。你说“我想要实现的是将最后 4 个字段的总和放入第一个 0 字段”和“......从原始字符串中删除标记并将“Key [*]”替换为.. ."。如果我尝试对此进行编程,我会认为该过程分为三个步骤 (1) 读取数据并将其存储为便于进行计算的某种格式 (2) 进行所需的计算并以某种方式存储结果 (3)生成所需格式的输出字符串。

【讨论】:

以上是关于C# - 使用标记来识别值的子字符串总和的主要内容,如果未能解决你的问题,请参考以下文章

使用 ClickHouse 提取和求和字符串内的子字段的值

有没有办法在 JSONPath 中获取字符串值的子字符串?

在 C# 中使用 LINQ 在字符串数组中查找确切的子字符串

c#数组的子字符串等价物[重复]

重命名python DataFrame的列值的子字符串

在C#中查找所有特定值的子节点