【问题标题】:FirstOrDefault() returns first letter of the stringFirstOrDefault() 返回字符串的第一个字母
【发布时间】:2018-09-14 15:45:51
【问题描述】:

我有一个人对象

        people.Add(new Person { FirstName = "Tim", Id = 1, LastName = "Corey" });
        people.Add(new Person { FirstName = "Sue", Id = 2, LastName = "Storm" });
        people.Add(new Person { FirstName = "Bilbo", Id = 3, LastName = "Baggins" });

我正在尝试通过传递 FirstName 和 LastName (Tim, Corey) 来查询它

return people.Where(names => names.FirstName == FirstName && names.LastName == LastName).FirstOrDefault().FirstName;

这会将输出返回为

"Tim"

当我在最后添加 .FirstOrDefault() 时。它带来了奇怪的输出为

return people.Where(names => names.FirstName == FirstName && names.LastName == LastName).FirstOrDefault().FirstName.FirstOrDefault();

84 'T'

谁能解释一下输出是如何产生的。

84 'T'

【问题讨论】:

  • 字符串是IEnumerable<char>
  • 那是因为当您将 FirstOrDefault 添加到您的 FirstName 时,它​​是字符串类型,它将返回字符串中的第一个字符
  • 您还期待什么结果?你有名字(蒂姆),你还需要什么?

标签: c# linq lambda


【解决方案1】:

您在FirstName 上调用.FirstOrDefault(),这是一个string。这将导致在IEnumerable<char> 实现上调用.FirstOrDefault()。这将导致返回 string 中的第一个或默认字符。

数值84 显示T 的ASCII 值。 http://www.rapidtables.com/code/text/ascii-table.html

【讨论】:

  • 84 怎么进来的?如果我只有 T 就好了。
  • 由于 T 是 char,它显示 T 的 ASCII 值,即 84。ASCII 码:rapidtables.com/code/text/ascii-table.html
  • 谢谢@Michael。我已将此添加到答案中
【解决方案2】:

字符串是字符数组,可以被Linq枚举。

FirstOrDefault 返回列表中的第一项,或 null。
在这种情况下,数组 ['T', 'i', 'm'] 中的第一个字符是 'T'。

我想这就是你要写的:

return people.First(names => names.FirstName == FirstName && names.LastName == LastName).FirstName;

注意:使用 FirstOrDefault 可能会返回 null,如果没有匹配项,则会导致 NullReferenceException。

或者:

var match = people.FirstOrDefault(n => n.FirstName == FirstName && n.LastName == LastName);
return (match == null) ? "" : match.FirstName;

【讨论】:

    【解决方案3】:

    是的 - string 本质上是 IEnumerable<char>,因此当您调用 FirstOrDefault() 时,您将返回 IEnumerable 中的第一个 char

    【讨论】:

    • 谁能向我解释我错了/为什么投反对票?
    猜你喜欢
    • 2013-10-02
    • 2012-06-27
    • 1970-01-01
    • 2020-06-02
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2013-09-24
    相关资源
    最近更新 更多