使用以下代码:
Guid? x = null;
List<Guid?> y = new List<Guid?>();
y.Add(x);
我希望以下代码返回 true y.Contains(x);
,但它返回 false。
所以这是一个两部分的问题。
- 为什么当列表中有 x 时它返回 false?
- 我将如何遍历 Guid?列表以检查列表中是否存在空值
Guid?
或Guid?
带值?
使用以下代码:
Guid? x = null;
List<Guid?> y = new List<Guid?>();
y.Add(x);
我希望以下代码返回 true y.Contains(x);
,但它返回 false。
所以这是一个两部分的问题。
Guid?
或Guid?
带值?让我们检查您的代码。没有语法糖,它真正说的是:
Nullable<Guid> x = new Nullable<Guid>(new Guid());
List<Nullable<Guid>> y = new List<Nullable<Guid>>();
y.Add(x);
Nullable<>
实际上是 a struct
,所以它从来都不是null
;只有它的Value
属性有可能存在null
,但由于它的基础类型 ( Guid
)也是a struct
,所以列表中的任何内容都不是真的 null
。
那我为什么要解释呢?好吧,List<>.Contains()
到了施展魔法的时候,这两种方法的结合条件struct
决定Equals()
了你的 empty Guid
s 不相等。
采用两个可空 guid 的可空相等运算符适用于这种情况,将被调用,并且始终返回 false。
由于Nullable
在您的解决方案中非常无用,我会重构您的代码以摆脱它。相反,我们可以使用Guid
一个方便的属性:Empty
Guid x = Guid.Empty;
List<Guid> y = new List<Guid>();
y.Add(x);
Console.WriteLine(y.Contains(x)); // True
Console.WriteLine(y.Contains(Guid.Empty)); // True
请参阅上面的实际操作:Ideone
再次,查看Eric Lippert 的这篇文章以获取更多信息。
如果您正在寻找列表中的所有null
(或空)项目,也许检查列表中的项目更有意义x
where x.HasValue
is false
:
var myList = new List<Guid>();
... /* add to myList */
var theEmpties = myList.Where(x => x == Guid.Empty);
好像你忘了 () 附近new List<Guid?>
。所以你的代码工作正常并y.Contains(x)
返回true。我的检查 Guid 代码List<Guid?>
:
Guid guid = Guid.NewGuid();
foreach (var elem in y)
{
if (elem != null && guid == elem.Value)
{
//CODE
}
}