gpt4 book ai didi

c# - 按顺序获取第一个缺失元素的有效方法?

转载 作者:太空狗 更新时间:2023-10-29 22:04:21 24 4
gpt4 key购买 nike

我有一个有序序列,例如 {1, 3, 5, 6, 8, 9} 我想获取第一个缺失的元素(示例中为 2)或 max() 如果序列不包含缺失元素。现在我这样做:

public static int GetRegisterNumber<T>(this IQueryable<T> enumerable, Func<T, bool> whereFunc, Func<T, int?> selectFunc)
{
var regNums = enumerable.OrderBy(selectFunc).Where(whereFunc).ToArray();

if (regNums.Count() == 0)
{
return 1;
}

for (int i = 0; i < regNums.Count(); i++)
{
if (i + 1 != regNums[i])
{
return regNums[i].Value + 1;
}
}

return regNums.Last().Value + 1;
}

但我认为有更快的方法。有什么建议吗?

最佳答案

编辑:我刚刚注意到 enumerableIQueryable<T>但是selectFuncwhereFunc类型为 Func<T, _> .这将导致 Enumerable OrderBy 的版本和 Where被调用,而不是使用数据库调用。您可能想将它们切换为 Expression<Func<T, _>>相反。

如果不想订购regNums首先,这是一个 O(n) 高尔夫风格的解决方案:

var max = regNums.Max(i => (int?)i) ?? 0;
return Enumerable.Range(1, max + 1)
.Except(regNums)
.Min();

按行:

  1. 通过转换为 int? , Max将返回 null如果regNums为空,合并为 0 .

  2. 构建所有可能寄存器的序列,包括我们的下一个值(如果已满)。

  3. 减去当前的寄存器组。

  4. 选择最低的。

关于c# - 按顺序获取第一个缺失元素的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1098601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com