[英]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.