【问题标题】:What is a best way to increment alphanumeric ID by certain value in C#? [closed]在 C# 中按某个值递增字母数字 ID 的最佳方法是什么? [关闭]
【发布时间】:2011-12-18 18:43:21
【问题描述】:

在 C# 中将字母数字 ID 增加某个值的最佳方法是什么?

例如:

我们有 345FAS310E575896325SA 并且我们将增加 123 ,所以我们有结果:345FAS310E575896325SA123

或者我们有 345FAS310E575896325SA123 并增加 234 ,结果应该是 345FAS310E575896325SA357

什么是让它工作的“最便宜”的方法?

【问题讨论】:

  • 在您的第一个示例中,您不是在增加,而是在追加。这正常吗?
  • 所以你是说只改变最后一组数字吗?将 40 添加到上一个示例中,这样现在您就有了 843342D4343DA123D100?
  • 你的例子没有以前那么有意义
  • 你还在追加。试试这个:解释你的算法。就算是坏的也好。
  • 也许澄清会有所帮助 - 您是想将“十进制 10”添加到“十六进制 843342D4343DA123D”还是附加字符串“10”?

标签: c# .net increment alphanumeric


【解决方案1】:

这是我的算法:

    static void Main(string[] args)
    {
        var id = "843342D4343DA123D";
        var intSummand = 10;
        Console.WriteLine(AddToStringId(id, intSummand));
        Console.ReadKey();
    }

    static string AddToStringId(string id, int summand)
    {                         
        // set the begin-pointer of for the number to the end of the original id
        var intPos = id.Length;
        // go back from end of id to the begin while a char is a number
        for (int i = id.Length - 1; i >= 0; i--)
        {
            var charTmp = id.Substring(i, 1).ToCharArray()[0];
            if (char.IsNumber(charTmp))
            {
                // set the position one element back
                intPos--;
            }
            else
            {
                // we found a char and so we can break up
                break;
            }
        }
        var numberString = string.Empty;
        if (intPos < id.Length)
        {
            // the for-loop has found at least one numeric char at the end
            numberString = id.Substring(intPos, id.Length - intPos);
        }
        if (numberString.Length == 0)
        {
            // no number was found at the and so we simply add the summand as string
            id += summand.ToString();
        }
        else
        {
            // cut off the id-string up to the last char before the number at the end
            id = id.Substring(0, id.Length - numberString.Length);
            // add the Increment-operation-result to the end of the id-string and replace
            // the value which stood there before
            id += (int.Parse(numberString) + summand).ToString();
        }
        // return the result
        return id;
    }

【讨论】:

  • 那根本不是真的。我的代码在 id 的末尾检查一个任意长度的数字,如果找到一个数字就会增加它。如果字符串以 char 结尾,它将简单地附加绕过的 id。这样任务就完成了!你试过我的代码了吗,Ramhound?
  • 请描述您的代码的作用,并可能添加几个 cmets。
  • 他至少提供了某种解决方案,如果你测试它,它实际上就像他提到的那样有效;如果字符串以数字结尾,则增加,否则增加。 +1
  • 只看代码:它只是从 End 解析字符串,并确定字母数字值的末尾是否有数字。如果不是:它只是将整数字符串附加到字母数字之一。如果是,它从字母数字结束子字符串创建一个整数,将整数和连接添加到结果字符串。 +1 提供解决方案。
【解决方案2】:

这里每个人都遇到的问题是,您的字母数字值实际上没有任何意义。

当你给出你的例子时,你只是在末尾添加数字并增加它们,你并没有真正向我们提供任何关于字母代表什么的信息。

为了能够像这样增加一个值,我们需要知道字母的值是什么,一个很好的例子是 HEX, 0 - 9 A - F 所以如果你说将 HEX 值 09 增加 1你会得到 0A 并将 0F 增加 1 得到 10

我知道这不是一个答案,但在您向我们提供一些关于您打算通过此实现的目标的真实信息之前,我们无法真正给出答案。还可以告诉我们您将其用于什么/为什么使用 AlphaNumeric 等?

【讨论】:

  • 抱歉,我没明白这里的问题。我明白这个问题。他想做的就是给字符串中最后一个完整的数字加上一些值。如果最后没有给出数字(字符串以 nun-numeric char 结尾),他想将其解释为 0。示例显示它非常好!?!?还是我错了?
  • 你不能只是通过添加尽可能多的数字来增加一个字母数字值,这不是一个真正的字母数字值,它只是一个随机的字母和数字字符串,他没有解释什么值字母代表等。例如,如果我做 A357 +1,000,000 怎么办?这只是成为A1000357吗?什么是A? A1 和 B1 等之间的数字差是多少?字母数字值的想法是它实际上代表了一些东西,而不仅仅是随机的
  • @sprinter252 如果这是真的,那么该算法有一个明显的缺陷:它会很快达到一些字符限制。
  • @sprinter252 这并不是因为他正在寻找一个被否决的答案,而是因为提供的信息无法理解这个问题。考虑一下 在他的例子中,他使用了 A 和 B,它们必须有一个值,所以如果 A+1 = A1,这里的 n 必须是什么 A + n = b?这是他的问题的一大败笔,没有这些信息,没有人能准确地回答它
  • @sprinter252 嗯,发生了三件事。首先,有社区的暴民规则反应。那应该处理得更好。暴徒一定把那张可怜的海报吓跑了……其次,这个问题有一个严重的缺陷,应该/本可以更清楚。第三,问题中存在一系列潜在缺陷,增量 =/= 追加,以及限制情况(99 之后会发生什么,10 以下会发生什么)和其他点,比如多久可以完成一次,这真的是一个好设计之类的?
【解决方案3】:

通过查看您的示例,我将其解释为:

如果没有 id 后缀,则应附加一个。否则,ID 应该递增。

private static void Main(string[] args)
{
    var id = IncrementId("345FAS310E575896325SA", 123); // AS310E575896325SA123
    var id2 = IncrementId(id, 234); //345FAS310E575896325SA357
}

public static string IncrementId(string value, int id)
{
    // you might want to use fixed length or something else
    int suffixPos = value.IndexOf("SA");

    // no id has been appended
    if (value.Length == suffixPos + 2)
        return value + id;

    // increment the existing id.
    var currentId = int.Parse(value.Substring(suffixPos + 2));
    currentId += id;
    return value.Substring(0, suffixPos + 2) + currentId;
}

【讨论】:

  • 如果您在编辑之前查看他的问题,最后一组字符已更改。 OP 也将其设置为 345FAS310E575896325SA 是现有的“ID”,因此下一个“ID”应该是 345FAS310E575896325SA123 但正如其他人指出的那样,345FAS310E575896325SA 只是 OP 示例中的一个字符串
  • 工作正常,但你必须知道,你在搜索什么('SA')。
  • @sprinter252 这就是我想要得到的。原来的例子是843342D4343DA123D
  • 因此我的评论you might want to use fixed length or something else
【解决方案4】:

子字符串方法?你在哪里传递你想要增加的数字,它会得到增加值的子字符串并将它们加在一起?

当增量超过 99 时会发生什么?

它只是在字母数字 ID 的末尾附加 100 吗?

字母数字 ID 的其余部分是否也保持不变?即:

843342D4343DA123D 10

843342D4343DA123D 20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多