C#LINQ内部对象查询

时间:2015-10-28 08:34:35

标签: c# linq nested nullreferenceexception

我对LINQ来说太新了。

public static Dictionary<Type, ConfigurationObjectBase> MyDictionary;

此表达式返回“未将对象引用设置为对象的实例”:

MyDictionary.First(o => o.Value.ID == 12).Key;

实际上,ID = 12的对象就在那里。

更新:

  

实际上,ID = 12的对象是

这意味着,字典中有ID为12的对象。

2 个答案:

答案 0 :(得分:3)

如果没有这样的项目,那么它会抛出 InvalidOperationException ,消息&#34;序列中不包含匹配的元素&#34;

这意味着:

  • 您的Dictionary未初始化。你说有ID = 12的对象。所以,这意味着它已初始化。

  • 词典中至少有一个项目的值为null。因此,在迭代时,它会尝试访问其Value.ID并抛出NullReferenceException

想象一个简单的数组循环:

ConfigurationObjectBase Search()
{
    ConfigurationObjectBase[] array = { someObject1, someObject2, null, someObject3 };

    foreach (var item in array)
    {
        if (item.ID == 12) return item;
        // here, if item is null, you will try to access its ID and get NullReferenceException
    }

    throw new InvalidOperationException("Sequence contains no matching elements");
}

实际上,这就是LINQ究竟做的事情。它遍历字典,一旦它尝试访问null的属性,就会抛出异常。

您可以使用以下代码来避免访问null的属性:

MyDictionary.First(o => o.Value != null && o.Value.ID == 12).Key;

答案 1 :(得分:3)

如果存在ID为12的对象,则表示您的字典包含空的对象。您可以过滤它们:

MyDictionary.Where(x=>x.Value!=null).First(o => o.Value.ID == 12).Key;

它将跳过null值的所有对象。我更喜欢在这里链接,因为它清楚地表明了意图。

编辑: 正如@Yeldar Kurmangaliyev所说,这个答案只适用于小词典。如果你想更好地使用大词典:

MyDictionary.First(o => o.Value!=null && o.Value.ID == 12).Key;