簡體   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