Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ中混合Any()和First()?_C#_Linq - Fatal编程技术网

C# 在LINQ中混合Any()和First()?

C# 在LINQ中混合Any()和First()?,c#,linq,C#,Linq,首先,我是林克的一个疯子! 然后,我有一个收藏: 其中一个不包含我的ID(字符串) 或者只包含一次 我想使用Where,但我不喜欢我必须执行的if指令。。。这是我的代码: if (MyCollection.Any(rm => rm.BaseName == rbName)) { var tmp = MyCollection.First(rm => rm.BaseName == rbName); } 这是可行的,但我真的觉得这不是我应该用LINQ做的方式。。。 有什么建议吗?非

首先,我是林克的一个疯子! 然后,我有一个收藏:

  • 其中一个不包含我的ID(字符串)
  • 或者只包含一次
  • 我想使用Where,但我不喜欢我必须执行的
    if
    指令。。。这是我的代码:

    if (MyCollection.Any(rm => rm.BaseName == rbName))
    {
        var tmp = MyCollection.First(rm => rm.BaseName == rbName);
    }
    
    这是可行的,但我真的觉得这不是我应该用LINQ做的方式。。。
    有什么建议吗?

    非唯一实体答案(在多个实例上引发异常)

    使用。如果存在,则返回唯一项;如果不存在,则返回null;如果存在多个,则抛出异常

    var tmp = MyCollection.SingleOrDefault(rm => rm.BaseName == rbName);
    
    唯一属性应答(永远不会有多个实例)

    如果您的系统设置为
    BaseName
    是唯一的实体,user
    FirstOrDefault
    ,如果存在多个异常,则不会引发异常,因为它将在第一个实例时停止,但系统的设计将确保不再存在相同的实例,因此可以接受(并减少时间)

    这里,如果您没有这样的记录,tmp将为null。

    使用
    FirstOrDefault(rm=>rm.BaseName==rbName)


    Any
    返回
    bool
    若要指示此类项目是否存在,
    首先返回集合中的记录。所以,在任何情况下,您都将拥有来自集合的对象和您的条件结果。您可以使用
    FirstOrDefault
    ,然后检查返回值是否为
    null

    var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);
    if (tmp != null) 
    {
        // do something
    }
    
    你可以用

    FirstOrDefault()
    


    正如权力所说,你应该使用或者。如果真正只有一个这样的条目,它们也会做同样的事情,但是如果使用LINQ to Objects,
    FirstOrDefault
    可能会更快-
    SingleOrDefault
    必须扫描整个序列,以检查没有任何其他匹配项

    如果存在多个匹配项,
    SingleOrDefault
    将抛出异常
    FirstOrDefault
    将只返回第一个匹配项

    因此,您可以使用:

    var result = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);
    if (result != null)
    {
        // Use it
    }
    

    请注意,如果序列元素类型是值类型,这可能会很尴尬,因为您可能无法区分元素类型的默认值(因为没有匹配项)和“真实”值。在这种情况下,这看起来不太可能是个问题,但值得记住。

    您应该检查
    FirstOrDefault
    为什么不使用FirstOrDefault(),然后在查询后检查结果是否为空或是否包含数据?不知道此方法:(无论如何,我更喜欢SingleOrDefault!这真的很好!异常处理非常好:)如果存在匹配,那么它将抛出异常,这在某种程度上很好,但是如果您的系统设置为不可能重复,那么将永远不需要异常,然后使用FirstOrDefault(只有当它是主键或在插入时设置了验证)这一点很好,Jon。很难判断它是主键还是唯一定义的元素,不过这是一个很好的补充。
    FirstOrDefault()
    
    SingleOrDefault()
    
    var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);
    if (tmp != null)
    {
        // Do something
    }
    
    var result = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);
    if (result != null)
    {
        // Use it
    }