C# 如何获取给定字母数字范围内的所有值

C# 如何获取给定字母数字范围内的所有值,c#,string,range,alphanumeric,C#,String,Range,Alphanumeric,我有一个类似字符串x=“AB001-AB050,AB055,AB060-AB099”的字符串 我正在寻找一个解决方案,以获得此范围内的所有值 输出应包含AB001和AB050之间的所有值,然后是AB055,然后是AB060和AB099之间的所有值 其他详细信息:前两个字符仅为字母。最后3个字符只是数字 示例:给定AB008-AB012、AB020 预期o/p:AB008、AB009、AB010、AB011、AB012、AB020你在找这样的东西吗 var prefix = "AB&qu

我有一个类似字符串x=“AB001-AB050,AB055,AB060-AB099”的字符串

我正在寻找一个解决方案,以获得此范围内的所有值

输出应包含
AB001
AB050
之间的所有值,然后是
AB055
,然后是
AB060
AB099
之间的所有值

其他详细信息:前两个字符仅为字母。最后3个字符只是数字

示例:给定AB008-AB012、AB020
预期o/p:AB008、AB009、AB010、AB011、AB012、AB020

你在找这样的东西吗

var prefix = "AB";
var x = "AB001-AB050, AB055, AB060-AB099";

var lean_x = x.Replace(prefix, "");

var ranges = lean_x.Split(',').Select(x =>
{
    var  interval = x.Split('-').Select(x => Convert.ToInt32(x)).ToArray();
    if (interval.Count() > 1)
        return Enumerable.Range(interval[0], interval[1] - interval[0] + 1);
        
    return Enumerable.Range(interval[0], 1);
}).SelectMany(p => p, (p,q) =>String.Format("{0}{1:000}", prefix, q));


ranges.Dump();

如果你不需要增加字母,这里有一个基于链接和现有答案的解决方案

基数26->10转换:
基于

长时间可枚举范围的简单实现: 基于

静态IEnumerable RangeLong(长启动、长计数)
{
对于(长i=0;i


此代码仅使用copypast from code和ressource在这个问题上链接而成,仅键入了
.Select(x=>x.Trim())
您的输入数据是什么?标识符的格式总是
,并且您希望所有标识符都使用相同的字母,但是数字在上下两个数字之间是不同的,在上下两个数字范围内总是相同的字母吗?或者你能要这个吗<代码> ABO1-1-AC050?考虑ABB1,如基36号。然后从AB001到AB002的增量可以通过转换为基数10来完成。我假设您将能够在
-
上进行拆分以获得范围限制。如果不是的话,还有3个问题。这里有一个相当简单的例子:如果前缀必须是递增的,那就好了。拆下
更换
。将每个
间隔[]
用一个
从base26到10的
换行。然后用
从base10到se26选择many
。很好的提示@萨加索普拉其余的都是你的了。我已经提交了一份答案,因为我发现用过去的副本解决这个变体很有趣。我可以使用您的解决方案进行解析吗?我可以做简单的循环简单。答案如下。@lassev.Karlsen。格式永远是[A-Z][A-Z][0-9][0-9][0-9]。@DervişKayımbaşıoğlu这正是我想要实现的,不过我想增加前缀。这真的很有帮助。非常感谢。
private static readonly char[] BaseChars =
 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
private static readonly Dictionary<char, int> CharValues = BaseChars
           .Select((c, i) => new { Char = c, Index = i })
           .ToDictionary(c => c.Char, c => c.Index);

public static string LongToBase(long value)
{
    long targetBase = BaseChars.Length;
    // Determine exact number of characters to use.
    char[] buffer = new char[Math.Max(
               (int)Math.Ceiling(Math.Log(value + 1, targetBase)), 1)];

    var i = buffer.Length;
    do
    {
        buffer[--i] = BaseChars[value % targetBase];
        value = value / targetBase;
    }
    while (value > 0);

    return new string(buffer, i, buffer.Length - i);
}

public static long BaseToLong(string number)
{
    char[] chrs = number.ToCharArray();
    int m = chrs.Length - 1;
    int n = BaseChars.Length, x;
    long result = 0;
    for (int i = 0; i < chrs.Length; i++)
    {
        x = CharValues[chrs[i]];
        result += x * (long)Math.Pow(n, m--);
    }
    return result;
}
var ranges = valuePart.Split(',')
                      .Select(x => {
                          var range = x.Split('-')
                                        .Select(x=> x.Trim()) // only thing I typed
                                        .ToList();

                          if (range.Count() > 1)
                              return RangeLong(BaseToLong(range[0]), BaseToLong(range[1]) - BaseToLong(range[0]) + 1);

                          return RangeLong(BaseToLong(range[0]), 1);
                      });

var result = ranges.SelectMany(x => x.Select(y=> LongToBase(y))).ToList();
        
static IEnumerable<long> RangeLong(long start, long count)
{
    for (long i = 0; i < count; i++) yield return start + i;
}