获取 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# 中工作。只要 LastOrDefault
和 FirstOrDefault
方法默认为 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?>();
来自 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# 中工作。只要 LastOrDefault
和 FirstOrDefault
方法默认为 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?
.
换句话说 - 您的方法需要获取可为空的数组才能使用空值。
如果您永远不会在提供的数组上使用空值,为什么不直接从 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?>();