如何检测是否有Guid?在List <guid?> </guid?>中

时间:2012-09-21 20:43:34

标签: visual-studio-2010 c#-4.0 lambda guid nullable

使用以下代码:

Guid? x = null;
List<Guid?> y = new List<Guid?>();
y.Add(x);

我希望以下代码返回true y.Contains(x);,但它返回false。

所以这是一个两部分的问题。

  1. 为什么在列表中有明显的x时它会返回false?
  2. 我如何在Guid中循环?列表以检查列表中是否有值为Guid?Guid?的值?

2 个答案:

答案 0 :(得分:3)

让我们检查您的代码。没有语法糖,它真正说的是:

Nullable<Guid> x = new Nullable<Guid>(new Guid());
List<Nullable<Guid>> y = new List<Nullable<Guid>>();
y.Add(x);

解释

Nullable<>实际上是struct,因此它并非真正null;只有Value属性才有null,但由于其基础类型(Guid一个struct列表中没有 真的 null

那我为什么要解释一下呢?好吧,当List<>.Contains()实现其魔力时,两个struct Equals()方法组合的条件决定了你的空Guid不等于。

  

带有两个可以为空的guid的可空等于运算符适用于这种情况,将被调用,并且将始终返回false。

Source

我们如何解决?

由于在您的解决方案中使用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的this post以获取更多信息。

更新

如果您要查找列表中的所有null(或空)项,那么检查x列表中的项x.HasValue是否更有意义是false

var myList = new List<Guid>();
... /* add to myList */
var theEmpties = myList.Where(x => x == Guid.Empty);

答案 1 :(得分:1)

好像你忘了()new List<Guid?>附近。所以你的代码工作正常,y.Contains(x)返回true。 我在List<Guid?>中检查Guid的代码:

Guid guid = Guid.NewGuid();
foreach (var elem in y)
{
    if (elem != null && guid == elem.Value)
    {
        //CODE
    }
}