C# LINQ 内部对象查询
C# LINQ inner object query
我对 LINQ 太陌生了。
public static Dictionary<Type, ConfigurationObjectBase> MyDictionary;
这个表达式returns"Object reference not set to an instance of an object":
MyDictionary.First(o => o.Value.ID == 12).Key;
其实ID=12的对象就在那里
更新:
In fact, the object with ID = 12 is there
表示字典中有ID为12的对象
如果没有这样的项目,那么它会抛出 InvalidOperationException
消息 "Sequence contains no matching element".
这意味着:
您的 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;
如果存在 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;
我对 LINQ 太陌生了。
public static Dictionary<Type, ConfigurationObjectBase> MyDictionary;
这个表达式returns"Object reference not set to an instance of an object":
MyDictionary.First(o => o.Value.ID == 12).Key;
其实ID=12的对象就在那里
更新:
In fact, the object with ID = 12 is there
表示字典中有ID为12的对象
如果没有这样的项目,那么它会抛出 InvalidOperationException
消息 "Sequence contains no matching element".
这意味着:
您的
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;
如果存在 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;