使用LINQ寻找下一个免费价值

时间:2018-10-07 14:48:18

标签: entity-framework linq

下面是一个非常简单的Entity类和数据示例。

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', '...'));

我不希望为给定的输入值返回下一个可用的 Classification 值。

例如:

  • '10 .000'-应该返回'10 .003'
  • '11 .000'-应该返回'11 .005'

对于上面的第一个示例,输入值为'10 .000',因此通过一步一步地检查值是否存在。只要数据库中已存在该值,我们就会继续搜索n + 1。

进行LINQ的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果整数中没有缺失值(例如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");