【问题标题】:linq.js return value of (default) FirstOrDefaultlinq.js 返回值(默认)FirstOrDefault
【发布时间】:2014-07-18 17:32:55
【问题描述】:

尝试检查 linq.js FirstOrDefault() 的结果,但检查 null 或 undefined 不起作用。调试时遇到了一些麻烦,但我可以看到它正在返回某种对象。

我找不到任何关于此方法的在线文档。

我试过了:

var value = Enumerable.From(stuff).FirstOrDefault('x => x.Name == "Doesnt exist"')

if (value) {
    alert("Should be not found, but still fires");
}

if (value != null)
    alert("Should be not found, but still fires");
}

【问题讨论】:

    标签: javascript linq.js


    【解决方案1】:

    FirstOrDefault() 函数的签名是:

    // Overload:function(defaultValue)
    // Overload:function(defaultValue,predicate)
    

    如果集合为空,第一个参数始终是返回的默认值。第二个参数是要搜索的谓词。你用的方法不对,你的查询应该写成:

    var value = Enumerable.From(stuff)
        .FirstOrDefault(null, "$.Name === 'Doesnt exist'");
    

    【讨论】:

    • 我想我可能仍然更喜欢使用 Where 子句的 C#-esque 格式,但我同意这是使用该函数的更正确的答案。没有意识到您必须指定“默认”应该是什么。谢谢!
    • 你必须意识到的是,在 C# 中,方法有隐式参数,即实际的编译时间类型。这不是你可以用 JS 真正表达的东西。 C# 知道这些类型的默认值是什么,因此能够填写。在 JS 中,没有可用的真实类型信息,因此需要提供默认值。碰巧undefined 通常就足够了。
    【解决方案2】:

    我们在我打字的时候找到了答案。由于文档太少,我会分享。

    您需要将 lambda 移动到 FirstOrDefault() 之前的 Where 子句中。

    何时

    var someArray = ["Foo", "Bar"];
    var result = Enumerable.From(someArray).Where('x => x == "Doesnt exist"').FirstOrDefault();
    

    结果未定义(正确)

    何时

    var someArray = ["Foo", "Bar"];
    var result = Enumerable.From(someArray).Where('x => x == "Bar"').FirstOrDefault();
    

    结果为“Bar”(正确)

    何时

    var someArray = ["Foo", "Bar"];
    var result = Enumerable.From(someArray).FirstOrDefault('x => x == "Bar"');
    

    结果是“Foo”(不正确)

    【讨论】:

    • 谢谢例如.. 目前找到这些有点困难
    • 我也发现了..那个链接是最有帮助的,但是由于在 C# 中使用 LINQ,我在将这些知识与这个库联系起来时遇到了一些麻烦。我能够做我想做的事需要..仍然希望找到更多的例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多