C#LINQ内部对象查询

本文关键字:查询 内部对象 C#LINQ | 更新日期: 2023-09-27 18:19:31

我对LINQ太陌生了。

public static Dictionary<Type, ConfigurationObjectBase> MyDictionary;

此表达式返回"对象引用未设置为对象实例":

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

事实上,ID为12的对象就在那里。

更新:

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

这意味着字典中存在ID为12的对象。

C#LINQ内部对象查询

如果没有这样的项,它将抛出InvalidOperationException,并显示消息"Sequence contains no matching element"

这意味着:

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

  • 字典中至少有一项的值为CCD_ 4。因此,在迭代时,它尝试访问其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;

如果有一个ID为12的对象,则表示您的字典包含null对象。你可以过滤它们:

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;