使用 LINQ 搜索数组时如何正确使用“?.”?

问题描述 投票:0回答:1

所以我有这个代码:

foreach (var user in ServersHolder.Servers.Find(f => f.ID == 9999).Online.FindAll(g => g.LoginPhase == 3))
{
    await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
}

我已经看到人们使用

?.
的地方,我相信在出现如下所示的空返回的情况下,但在这种情况下下面的代码不起作用。

foreach (var user in ServersHolder.Servers?.Find(f => f.ID == 9999).Online?.FindAll(g => g.LoginPhase == 3))
{
    await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
}

有人可以解释一下吗?或者最好的做法是这样做:

if (ServersHolder.Servers.Exists(f => f.ID == 9999))
{
    foreach (var user in ServersHolder.Servers.Find(f => f.ID == 9999).Online.FindAll(g => g.LoginPhase == 3))
    {
        await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
    }
}
c# linq null-conditional-operator
1个回答
1
投票

在第二个代码部分中,您对

ServersHolder.Servers
执行空检查。

在最后一个代码部分中,您验证

ServersHolder.Servers
中是否存在任何匹配的记录。

两者都执行不同的验证。

总结您需要的验证和数据抓取逻辑:

  1. 验证
    ServersHolder.Servers
    不为空。
  2. 使用
    ID = 9999
    中的
    ServersHolder.Servers
    验证记录是否存在。
  3. (2)之后的
    Online
    属性不能为空。
  4. 过滤
    Online
    属性中的所有记录。

正如评论中提到的,由于您没有在

foreach
循环中处理 null 值,因此您将收到空引用异常(NRE)。如果链(带有
?.
空检查运算符)返回
null
,您需要提供默认/空列表。

foreach (var user in ServersHolder.Servers
    ?.Find(f => f.ID == 9999)
    ?.Online
    ?.FindAll(g => g.LoginPhase == 3) ?? new List<OnlineModel>())
{
    await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
}
© www.soinside.com 2019 - 2024. All rights reserved.