Although this does not seem to me to be the solution to your problem, this is an answer to your question.
See two examples of how to find the first interval / 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 sort 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');