从特定范围内的数字列表中查找可用号码

本文关键字:查找 号码 列表 数字 范围内 | 更新日期: 2023-09-27 18:36:51

>场景:数据库有带有帐号列表的表格。 帐号范围为 0-9999。 允许客户在该范围内为其认为合适的客户提供帐号。

需要:我正在生成一个以范围格式显示未使用的帐号的报告。 因此,我需要一个字符串列表,以范围格式显示可用的帐号。

例:帐号 0、1、2、4、20、21、22 都在数据中使用。 所以结果列表将是...


35-19
岁23-9999

整天都在磕磕绊绊。 如何使用直接的 c# 做到这一点?

从特定范围内的数字列表中查找可用号码

使用范围和除外

var acctNos = new List<int>() { 0,1,2,4,20,21,22 };
var unusedAcctNos = Enumerable.Range(0,9999).ToList().Except(acctNos);

然后,要对连续整数进行分组,请修改此处给出的已接受解决方案。

根据您获取帐号数据的方式,如下所示:

var nums = Enumerable.Range(0, 9999).ToList();
var usedNums = new List<int> {0, 1, 2, 3, 4, 20, 21, 22};
var availableNums = nums.Except(usedNums);

这将为您提供可用整数的 IEnumerable。 然后,将它们格式化为"3, 5-19, 23-99"将需要额外的逻辑。

//assuming already sorted
var a = Enumerable.Range(0, 10000);
//assuming alredy sorted
var b = new List<int>(){0, 1, 2, 4, 20, 21, 22};
//get the values not used yet in sorted order
var c = a.Except(b).ToList();
//store the list range
List<string> range = new List<string>();
for(int i = 0; i < c.Count; i++)
{
    //current start range
    int current = c[i];
    string r = current.ToString();
    int next;
    if(current > b.Last())
        next = c.Last() + 1;
    else
        next = b.FirstOrDefault( x => x > current);

    if( next != current+1)
        r += "-" + (next-1).ToString();
   range.Add(r);

   while(c[i] < next-1) i++;
 }
bool[] accountNumbers = new bool[10000];
for(int accountNumber in collection){
    accountNumbers[accountNumber] = true;
}

string available = '';
for(int i = 0; i <  accountNumbers.length; ++i){
 if(!accountNumbers[i]) available += (i + ',');
}
available = available.substring(0, available.length-2);

你必须像我刚刚写的那样测试它(使用joshes解决方案来获取列表)

var acctNos = new List<int>() { 0,1,2,4,20,21,22 };
var unusedAcctNos = Enumerable.Range(0, 10000).Except(acctNos).ToList();
StringBuilder builder = new StringBuilder();
int lastNo = unusedAcctNos.Last();
int previousVal = -2;
bool isRange = false;
foreach (int i in unusedAcctNos)
{
    if (i == previousVal + 1 && i != lastNo) //is in range
    {
        previousVal = i;
        isRange = true;
        continue;
    }
    else if (previousVal > -1) //range broke
    {
        if (isRange)
        {
            builder.Append("-");
            if (i == lastNo && previousVal == i - 1)
            {
                builder.Append(i);
                break;
            }
            else
            {
                builder.Append(previousVal);
            }
            isRange = false;
        }
        builder.Append(",");//change group splitter here
    }
    builder.Append(i);
    previousVal = i;
}

大型解决方案:)

  static List<string> getAvailablesRanges(List<int> data,int maxrange)
        {
            List<string> ranges = new List<string>();
            string last = null;
            foreach (int i in data)
            {
                if (i == data.Max() && i != maxrange)
                {
                    if (last != null) ranges.Add(last + "-" + i);
                    ranges.Add(i + "-" + maxrange);
                }
                else if (last == null)
                    last = i.ToString();
                else
                {
                    if(i-int.Parse(last)>1) ranges.Add(last + "-" + i);
                    last = null;
                }
            }
            return ranges;
        }