c# – Search for missing record range

Question:

Imagine the following situation: a table looks like this:

Id (int) - Codigo (int) - Descricao (varchar)
1        -      01      - Descrição 1
2        -      03      - Descrição 2
3        -      04      - Descrição 3
4        -      05      - Descrição 4

Notice that between Id 1 and 2 the code "02" is missing. I'm looking for a way to find out if there is a "code available" between the table records and show it in a TextBox, but I'm not managing to organize the idea to do this query. I'm using Linq. Could someone help me with this? Hugs to everyone.

Answer:

While I don't think this is the solution to your problem, it is an answer to your question.

Here are two examples of how to find the first gap/hole in a set of codes represented as string , but which can be converted to integers.

Using Linq , Range() and Except() with just a few additional validations.

string[] codigos = { "01", "03", "05", "04" };

List<int> codigosConvertidos = codigos.Select(x => int.Parse(x)).ToList();
int intervaloEncontrado = 1;
int valorMaximo = codigosConvertidos.Max();

if (valorMaximo > 0)
    intervaloEncontrado = Enumerable.Range(codigosConvertidos.Min(), codigosConvertidos.Count()).Except(codigosConvertidos).FirstOrDefault();                                   

int primeiroCodigoDisponivel = intervaloEncontrado > 0 ? intervaloEncontrado : valorMaximo + 1;

string resultado = primeiroCodigoDisponivel.ToString().PadLeft(2, '0');

And below I leave another example using Linq just to order the vector

string[] codigos = { "01", "03", "05", "04" };

var inteirosOrdenados = codigos.Select(x => int.Parse(x)).OrderBy(x => x).ToArray();

int? codigoAnterior = null;
int? intervaloEncontrado = null;

int tamanhoVetor = inteirosOrdenados.Length;
for (int i = 0; i < tamanhoVetor; i++)
{
    if (codigoAnterior != null)
    {
        int intervaloEsperado = inteirosOrdenados[i] - 1;

        if (intervaloEsperado != codigoAnterior)
        {
            intervaloEncontrado = intervaloEsperado;
            break;
        }
        else
        {
            codigoAnterior = inteirosOrdenados[i];
        }
    }
    else
    {
        codigoAnterior = inteirosOrdenados[i];
    }

}

if (intervaloEncontrado == null)
    intervaloEncontrado = inteirosOrdenados[tamanhoVetor - 1] + 1;

string resultado = intervaloEncontrado.ToString().PadLeft(2, '0');
Scroll to Top