获取 null 作为整数类型的默认值

Get null as a default for integer types

来自 Leetcode Discussion 的算法使用二叉搜索树来保存输入数组中的一系列值,以检查该数组是否包含最多相差 t 的值,并且它们的索引最多相差 k .

JAVA:

public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
    if (nums == null || nums.length == 0 || k <= 0) {
        return false;
    }

    final TreeSet<Integer> values = new TreeSet<>();
    for (int ind = 0; ind < nums.length; ind++) {

        final Integer floor = values.floor(nums[ind] + t);
        final Integer ceil = values.ceiling(nums[ind] - t);

        if ((floor != null && floor >= nums[ind])
                || (ceil != null && ceil <= nums[ind])) {
            return true;
        }

        values.add(nums[ind]);
        if (ind >= k) {
            values.remove(nums[ind - k]);
        }
    }
    return false;
}

我正在努力让它在 C# 中工作。只要 LastOrDefaultFirstOrDefault 方法默认为 return 0,此代码就不起作用。如何变通将 null 作为默认值?

C#:

public bool ContainsNearbyAlmostDuplicate(int[] nums, int k, int t)
{
    if (nums == null || nums.Length < 2 || k < 1) return false;

    SortedSet<long> set = new SortedSet<long>();

    for (int i = 0; i < nums.Length; i++)
    {
        long l = (long)nums[i];

        long floor = set.LastOrDefault(n => n <= l);
        long ceil = set.FirstOrDefault(n => n >= l);

        if ((l - floor <= t) || (ceil - l <= t))
            return true;

        set.Add(l);
        if (i >= k) set.Remove((long)nums[i - k]);
    }
    return false;
}

使用 nullable long 在 LastOrDefault 上获取 null

SortedSet<long?> set = new SortedSet<long?>();

一种方法是使用可为空的 longs 声明你的集合

var set = new SortedSet<long?>();

或者您可以不使用 FirstOrDefault 并执行如下操作:

var greaterOrEqualToOne = set.Where(n => n >= 1);

long? ceil = greaterOrEqualToOne.Any() ? greaterOrEqualToOne.First() : null;

另一种方式,首先将它们转换为 long?

long? ceil = set.Select(n => (long?)n).FirstOrDefault(n => n >= 1);

如果你想检索 int/long/... 包括 null 的值,那么你需要用户 Nullable Types

并且在您的源代码中将是:

 SortedSet<long?> set = new SortedSet<long?>();

其他答案在技术上是正确的(在你的集合上使用可为空的类型)

SortedSet<long?> set = new SortedSet<long?>();

但是,为了从 FirstOrDefault/LastOrDefault 接收空值,您需要将 int?[] nums 传递给您的方法,因为您通过铸造

long l = (long)nums[i];

即使强制转换为可空 long?.

,也不会从 int 数组中获取空​​值

换句话说 - 您的方法需要获取可为空的数组才能使用空值。

如果您永远不会在提供的数组上使用空值,为什么不直接从 i = 1 迭代?

您可以将其 int/long 转换为可空类型 (?),如其他用户所述,然后使用 DefaultIfEmpty 创建一个默认集合,如果集合结果为空,则包含 null。

SortedSet<long?> set = new SortedSet<long?>();

long? floor = set.Where(n => n <= l).DefaultIfEmpty().LastOrDefault();
long? ceil = set.Where(n => n >= l).DefaultIfEmpty().FirstOrDefault();

如果你想声明 int,long... values 为 NULL,你需要这样声明:

int? empId;
if(empId is null)
{
    // do this
}
else
{
    //do this
}

以同样的方式你必须使用:

SortedSet<long?> sortedSet = new SortedSet<long?>();