[英]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 或空。
从这三个字符串中的每一个,
Enumerable.Empty<char>
结果:仅包含每个字符串的第一个字符的字符序列,如果字符串为 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);
因此,从我们最初的输入示例中,我们有:
所以我们要做的就是将它们转换为大写并转换为字符串:
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.