繁体   English   中英

LINQ:Null 检查 string.Format()

[英]LINQ: Null checking in string.Format()

我需要获取名字、中间名和姓氏的第一个字母。 如果每个字段都包含值,则它正在工作。 但中间名是可为空的字段。 因此,如果中间名的值为 null,我会收到错误消息。

(from P in this._dbContext.Person
                     where P.PersonIndex == personIndex
                     select new PersonInitialsDTO
                     {
                         PersonIndex = P.PersonIndex,
                         PersonInitials = string.Format("{0}{1}{2}", P.FirstName.ToUpper().First(), P.MiddleName.ToUpper().First(), P.LastName.ToUpper().First())
                     }).FirstOrDefault();      

使用? 在执行下一个方法之前查看该值是否为 null。

string.Format("{0}{1}{2}", P.FirstName.ToUpper().First(), P.MiddleName?.ToUpper().First(), P.LastName.ToUpper().First())

P.MiddleName?.ToUpper().First() -> 如果P.MiddleName是 null,之后不要执行 ToUpper() 或任何其他方法。


的使用示例? 在 string.format 语句中

Pers person = new Pers()
{
    First = "First",
    Last = "Last"
};
Console.WriteLine(string.Format("{0}{1}{2}", person.First.First(), person.Middle?.ToUpper().First(), person.Last.First()));

// Prints
FL

要求:获取名字、中间名和姓氏的第一个字母。

好吧,显然这个要求并不完整:如果其中一个名称是 null 或为空,则没有第一个字母。

此外:如果我查看代码,您不需要第一个字母,而是需要一个包含第一个字母的字符串。

如果您只使用第一个字符,为什么要将完整的字符串大写?

所以让我们稍微改变一下:

要求:给定三个字符串:first、middle 和 last,给我包含每个字符串的第一个字符的大写值的字符串,或者 String.Empty,如果字符串是 null 或空。

  • “文森特”“凡”“高”=>“VVG”
  • “伦勃朗”“面包车”“rijn”=>“RVR”
  • “皮特”“蒙德里安”=>“下午”

从这三个字符串中的每一个,

  • 检查是否是null,如果是,使用Enumerable.Empty<char>
  • 创建一个仅包含字符串第一个字符的序列。 因此,如果字符串是 null 或为空,则第一个字符将是一个空字符序列)。
  • 连接这三个序列。

结果:仅包含每个字符串的第一个字符的字符序列,如果字符串为 null 或为空,则根本不包含字符。

在小步骤中,我会在前面写出类型,这样你就可以看到会发生什么。

string first = ...
string middle = ...
string last = ...
IEnumerable<char> firstChars = first?.Take(1) ?? Enumerable.Empty<char>(),
IEnumerable<char> midChars = middle?.Take(1) ?? Enumerable.Empty<char>(),
IEnumerable<char> lastChars = last?.Take(1) ?? Enumerable.Empty<char>(),
IEnumerable<char> chars = firstChars.Concat(midChars).Concat(lastChars);

因此,从我们最初的输入示例中,我们有:

  • 文森特梵高:{'V', 'V', 'G'}
  • rembrandt van rijn: {'r', 'v', 'r'}
  • 皮特·蒙德里安 {'p', 'm'}

所以我们要做的就是将它们转换为大写并转换为字符串:

IEnumerable uppercaseChars = chars.Select(c => Char.ToUpper(c));

注意:直到知道查询没有被执行! 我只使用了使用延迟执行的方法!

字符串结果 = 新字符串(大写字符。ToArray());

当然,您可以将其写在一个大的 LINQ 语句中。 我不确定这是否会提高可读性。 它不会对性能产生任何影响。

我试过下面。 现在它正在工作

(from P in this._dbContext.Person
    where P.PersonIndex == personIndex
    select new PersonInitialsDTO
    {
        PersonIndex = P.PersonIndex,
        PersonInitials = (P.MiddleName == "") 
            ? string.Format("{0}{1}", P.FirstName.ToUpper().First(), 
                P.LastName.ToUpper().First()) 
            : string.Format("{0}{1}{2}", P.FirstName.ToUpper().First(), 
                P.MiddleName.ToUpper().First(), P.LastName.ToUpper().First())
    }).FirstOrDefault();   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM