C# 从两个整数中获取一个范围

C# 从两个整数中获取一个范围,c#,C#,字符串num包含示例48030-48039 字符串[]numArr将包含4803048039 现在我有两个元素,高和低。我现在需要得到从48030到48039的所有数字。问题是它必须是字符串,因为电话号码时不时会有前导零 这就是为什么我不能为此使用Enumerable.Range.ToArray 有什么建议吗?预期结果应为480304803148032,48039这应该适用于您的领先零需求: string num = db.SelectNums(id); string[] numArr = nu

字符串num包含示例48030-48039

字符串[]numArr将包含4803048039

现在我有两个元素,高和低。我现在需要得到从48030到48039的所有数字。问题是它必须是字符串,因为电话号码时不时会有前导零

这就是为什么我不能为此使用Enumerable.Range.ToArray


有什么建议吗?预期结果应为480304803148032,48039

这应该适用于您的领先零需求:

string num = db.SelectNums(id);
string[] numArr = num.Split('-').ToArray();
需要注意的几点:

它假定您的输入是由一个连字符分割的2个有效整数 我给你一个字符串数组的结果,就我个人而言,我更愿意在最后使用一个列表 如果第一个数字包含一个前导零,则所有结果将包含一个前导零 它使用long来处理较长的数字,请注意,将解析的最大数字是9223372036854775807,您可以使用ulong将该值加倍,而不是长度 你是这么说的吗

For Each item In Enumerable.Range(min, count).ToArray()
  something = item.PadLeft(5, "0")
Next

我希望你的字符串总是有两个有效的整数,所以用Parse代替TryParse

int[] nums = new int[numArr.Length];
for (int i = 0; i < numArr.Length; i++)
{
    nums[i] = Convert.ToInt32(numArr[i]);
}
Array.Sort(nums);
for (int n = nums[0]; n <= nums[nums.Length - 1]; n++)
{
    Console.WriteLine(n);
}
如果您需要无效的字符串

string[] strList = "48030-48039".Split('-').ToArray();

var lst = strList.Select(int.Parse).ToList();
var min = lst.OrderBy(l => l).FirstOrDefault();
var max = lst.OrderByDescending(l => l).FirstOrDefault();
var diff = max - min;

//adding 1 here otherwise 48039 will not be there
var rng = Enumerable.Range(min,diff+1);

这是一种方法:

 var num = 0;
 var lst = (from s in strList where int.TryParse(s, out num) select num).ToList();
可以使用string.Format确保数字的格式为前导零。这将使该方法适用于任意数量的前导零

    public static string[] RangeTest()
    {
        Boolean leadingZero = false;
        string num = "048030-48039"; //db.SelectNums(id);
        if (num.StartsWith("0"))
            leadingZero = true;

        int min = int.Parse(num.Split('-').Min());
        int count = int.Parse(num.Split('-').Max()) - min;
        if (leadingZero)
            return Enumerable.Range(min, count).Select(x => "0" + x.ToString()).ToArray();
        else
            return Enumerable.Range(min, count).Select(x => "" + x.ToString()).ToArray(); ;
    }

评论中提出了三个重要问题:

电话号码的位数足以超过Int32.MaxValue,因此 转换为int是不可行的

对于某些情况,电话号码可能会有前导零 国际电话

从理论上讲,数字的可能范围可能超过可能存在内存问题的数组的最大大小,我认为可能不会表示为字符串

因此,您可能需要使用long而不是int,如果需要非常大的范围,我建议使用延迟执行

// prints 0000012, 0000013, 0000014
Console.WriteLine( CreateRange("0000012-0000014") );
正常情况下,该范围将产生70亿个结果,这些结果无法存储在数组中,并且可能会遇到内存问题,我甚至不确定它是否可以存储在字符串中;通过使用延迟执行,您只需要创建所需的100个

如果范围很小,仍然可以根据需要将结果合并成字符串:

var first100Numbers = 
    EnumeratePhoneNumbers("0018155500-7018155510")
    .Take(100)
    .ToArray();
当然,您可以将此数组创建放在自己的助手方法中:

string numberRanges = String.Join(", ", EnumeratePhoneNumbers("0018155500-0018155510"));
因此,您的用法是:

public static string GetPhoneNumbersListing(string fromAndTo)
{
    return String.Join(", ", EnumeratePhoneNumbers("0018155500-0018155510"));
}

灵感来自以下方面的完整解决方案:

投入:

起点:48030 完:48039 数字:6 预期的字符串输出:

048030, 048031, 048032, 048033, 048034, 048035, 048036, 048037, 048038, 048039 节目:

使用制度; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 公共课程 { 公共静态真空总管 { int first=48030; int last=48039; 整数位数=6; Console.WriteLineRecreateRangeFirst、last、digits; } 公共静态字符串CreateRangeint first,int last,int numDigits { 字符串分隔符=; var sb=新的StringBuilder; sb.Appendfirst.ToString.PadLeftnumDigits,“0”; 枚举中的foreach int num.Rangefirst+1,last-first { sb.Appendseparator+num.ToString.PadLeftnumDigits,“0”; } 使某人恢复原状; } }
所以,基本上,你在问如何,然后把它们转换成一个字符串?48030和48039之间的哪个数字有前导零?。。不管怎样,它不一定是一个字符串,因为你可以在你有了一个字符串后,通过它的声音在字符串上加上零range@Sayse如果你用某种填充物来固定长度。。。但确实很奇怪:@Sayse我说过会不时有带前导零的数字。基本上,我想要一个数组,数组中的每个数字作为一个单独的元素。什么是电话号码时不时带前导零?前导零有什么问题?你们为什么不把你们想要的结果或者一个前导零的数字的例子展示出来呢?这正是我想的,但事实并非如此c@Sayse:没错。你的观察能力金星。别开玩笑了,把它翻译成C语言简直是小事一桩。我确信OP是有能力的。我试过了,我得到的值对于Int32来说要么太大要么太小。拆分[0]包含4618155500。请记住,48030只是一个示例。数字会有很大差异。@user3218338:那么您需要多少前导零?您的示例只有5位数字。编辑:那么,在这种情况下,您可能想考虑使用长,但现在我想知道,如果范围太大,在这种情况下,是可用的;我们可能希望在这里采用延迟执行。数字可以从XXXX到XXXXXXXXXXXX不等。最多只能有一个前导零。编辑:为什么要获得4553030-4553039之间的范围会如此困难。是10个数字吗?@user3218338:对不起,前面的零位要求漏掉了。。。但如何确定生成的数字中是否有一个前导零呢 I’我想把它们当作一个字符串,因此我不必担心前导零。
var first100Numbers = 
    EnumeratePhoneNumbers("0018155500-7018155510")
    .Take(100)
    .ToArray();
string numberRanges = String.Join(", ", EnumeratePhoneNumbers("0018155500-0018155510"));
public static string GetPhoneNumbersListing(string fromAndTo)
{
    return String.Join(", ", EnumeratePhoneNumbers("0018155500-0018155510"));
}
string numberRanges = GetPhoneNumbersListing("0018155500-0018155510");