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

时间:2013-03-17 08:43:09

标签: c# string sum substring

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

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的范围内)。我只是在返回完成的构建字符串之前计算最后的总数。代码的结构方式我失去了分割字段的能力,因此放置标记以显示字段在字符串中的位置,并能够以这种方式计算总数。

2 个答案:

答案 0 :(得分:0)

仅讨论问题的第一部分!

假设您在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];
    }
}

答案 1 :(得分:0)

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