【问题标题】:Get null as a default for integer types获取 null 作为整数类型的默认值
【发布时间】:2018-09-05 10:10:15
【问题描述】:

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 方法默认返回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;
}

【问题讨论】:

    标签: c# .net binary-search-tree sortedset


    【解决方案1】:

    一种方法是使用可为空的 long 声明您的集合

    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);
    

    【讨论】:

      【解决方案2】:

      使用 nullable long 在 LastOrDefault 上获取 null

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

      【讨论】:

        【解决方案3】:

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

        在你的源代码中将是:

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

        【讨论】:

          【解决方案4】:

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

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

          但是,为了从 FirstOrDefault/LastOrDefault 接收空值,您需要将 int?[] nums 传递给您的方法,因为您通过强制转换填充您的集合

          long l = (long)nums[i];
          

          即使转换为可空的long?,它也不会从 int 数组中获取空​​值。

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

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

          【讨论】:

            【解决方案5】:

            如果要将 int,long... 值声明为 NULL,则需要这样声明:

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

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

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

            【讨论】:

              【解决方案6】:

              您可以将 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();
              

              【讨论】:

              • 该代码无法编译。 DefaultIfEmpty 也是不必要的,因为 OrDefault 已经为您执行此操作(即,如果 Where 中没有匹配的元素,则返回 null)。
              猜你喜欢
              • 2016-11-24
              • 1970-01-01
              • 2010-10-03
              • 2011-02-22
              • 1970-01-01
              • 2023-02-09
              • 1970-01-01
              • 1970-01-01
              • 2019-08-17
              相关资源
              最近更新 更多