Поиск следующего бесплатного значения с помощью LINQ - PullRequest
0 голосов
/ 07 октября 2018

Ниже приведен очень простой класс сущностей и образец данных.

Public Class MyTable 
   Public int Id { get; set; } 
   Public string Classification { get; set; }
   Public string Description { get; set; }
}

// Sample data :
context.MyTable.Add(new MyTable('10.000', '...'));
context.MyTable.Add(new MyTable('10.001', '...'));
context.MyTable.Add(new MyTable('10.002', '...'));
context.MyTable.Add(new MyTable('11.000', '...'));
context.MyTable.Add(new MyTable('11.001', '...'));
context.MyTable.Add(new MyTable('11.002', '...'));
context.MyTable.Add(new MyTable('11.003', '...'));
context.MyTable.Add(new MyTable('11.004', '...'));
context.MyTable.Add(new MyTable('12.000', '...'));

Я хочу вернуть следующее бесплатное значение Классификация для заданного входного значения.

Например:

  • '10 .000 '- должен возвращать '10 .003'
  • '11 .000 '- должен возвращаться '11 .005'

Для первого приведенного выше примера входное значение равно «10 .000», поэтому, шагая один за другим, мы проверяем, существует ли значение или нет.Когда значение в БД уже существует, мы продолжаем поиск n + 1.

Каков наилучший способ продолжить работу с LINQ?

1 Ответ

0 голосов
/ 07 октября 2018

Если бы не было пропущенных значений в целом числе (например, 10.000), то вы могли бы получить самое высокое с помощью:

string input = "10.000";
string nextFree = input;
string max = mySet
    .Where(x => x.Classification.StartsWith(input.Substring(0, 3)) // I.e. "10."
    .Select(x => x.Classification)
    .DefaultIfEmpty()
    .Max();
if (max != null) {
    decimal maxNum = Decimal.Parse(max);
    nextFree = (maxNum + 0.001m).ToString("0.000");
}

Но если между пропущенными значениями есть:

string input = "10.000"; // Must always be a value with .000
var classifications = mySet
    .Where(x => x.Classification.StartsWith(input.Substring(0, 3))
    .OrderBy(x => x.Classification)
    .Select(x => x.Classification)
    .ToList();
decimal nextNum = Decimal.Parse(input);
foreach (string classification in classifications)
{
    decimal n = Decimal.Parse(classification);
    if (n > nextNum) {
        break; // Found the next free value.
    }
    nextNum += 0.001m;
}    
string nextFree = nextNum.ToString("0.000");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...