ทำตัวอักษรตัวแรกของตัวพิมพ์ใหญ่ของสตริง (ด้วยประสิทธิภาพสูงสุด)


448

ฉันมีDetailsViewด้วยTextBox และฉันต้องการข้อมูลของท่านได้รับการบันทึกไว้เสมอกับเมืองหลวงแห่งแรกในจดหมาย

ตัวอย่าง:

"red" --> "Red"
"red house" --> " Red house"

ฉันจะบรรลุประสิทธิภาพสูงสุดนี้ได้อย่างไร


หมายเหตุ :
จากคำตอบและความคิดเห็นภายใต้คำตอบหลายคนคิดว่าสิ่งนี้กำลังถามเกี่ยวกับการใช้อักษรตัวพิมพ์ใหญ่ทั้งหมดในสตริง เช่น=> Red House มันไม่ได้ แต่ถ้านั่นคือสิ่งที่คุณต้องการให้มองหาหนึ่งในคำตอบที่ใช้TextInfoเป็นToTitleCaseวิธีการ (หมายเหตุ: คำตอบเหล่านั้นไม่ถูกต้องสำหรับคำถามที่ถามจริง)
ดูTextInfo.ToTitleCase docสำหรับ caveats (ไม่ได้สัมผัสคำที่มีตัวพิมพ์ใหญ่ทั้งหมด - ถือว่าเป็นตัวย่อซึ่งอาจเป็นตัวพิมพ์เล็กในคำกลางที่ "ไม่ควร" ลดลงเช่น "McDonald" => "Mcdonald"; ไม่รับประกันว่าจะจัดการกฎการใช้ตัวพิมพ์เล็กทั้งหมดสำหรับวัฒนธรรมโดยละเอียด)


หมายเหตุ :
คำถามที่คลุมเครือว่าตัวอักษรหลังแรกควรถูกบังคับให้พิมพ์เล็กหรือไม่ คำตอบที่ได้รับการยอมรับสมมติว่าเฉพาะอักษรตัวแรกควรจะมีการเปลี่ยนแปลง หากคุณต้องการที่จะบังคับตัวอักษรทั้งหมดในสตริงยกเว้นคนแรกจะเป็นกรณีที่ต่ำกว่ามองหาคำตอบที่มีToLowerและไม่ได้มี ToTitleCase


7
@ บ๊อบบี้: มันไม่ซ้ำกัน: OP ขอให้อักษรตัวแรกของสตริงเป็นตัวอักษรตัวใหญ่คำถามในลิงก์จะใช้อักษรตัวใหญ่ของอักษรตัวแรกของแต่ละคำ
GvS

1
@GvS: คำตอบแรกนั้นละเอียดมากและบล็อคโค้ดตัวแรกนั้นตรงกับที่เขาต้องการ นอกจากนี้ระหว่างการใช้ตัวพิมพ์ใหญ่ทุกคำกับคำแรกคือความแตกต่างของวงเดียว
Bobby

คุณเคยแก้ไขปัญหานี้สำเร็จหรือไม่? คุณยังต้องการความช่วยเหลือในเรื่องนี้หรือไม่?
jcolebrand

1
แต่คุณพูดและฉันก็พูดว่า "ทำตัวอักษรตัวแรกของตัวพิมพ์ใหญ่แต่ละตัว" ดังนั้นทำไม "บ้านแดง" -> "บ้านแดง" ทำไม "h" ของ "บ้าน" ไม่ใช่อักษรตัวใหญ่?
Guillermo Gutiérrez

เพิ่มคำตอบเนื่องจากคำตอบส่วนใหญ่จะล้มเหลวหากคุณมีพื้นที่สีขาวในการเริ่มต้น เพื่อหลีกเลี่ยงการโพสต์สิ่งนี้ในแต่ละคำตอบฉันจะโพสต์ไว้ที่นี่หนึ่งครั้ง
Noctis

คำตอบ:


583

อัปเดตเป็น C # 8

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => input.First().ToString().ToUpper() + input.Substring(1)
        };
}

C # 7

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input)
    {
        switch (input)
        {
            case null: throw new ArgumentNullException(nameof(input));
            case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
            default: return input.First().ToString().ToUpper() + input.Substring(1);
        }
    }
}

คำตอบเก่าจริงๆ

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}

แก้ไข : รุ่นนี้สั้นกว่า สำหรับวิธีแก้ปัญหาที่รวดเร็วกว่าดูที่คำตอบของ Equiso

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + input.Substring(1);
}

แก้ไข 2 : อาจเป็นทางออกที่เร็วที่สุดคือDarren (มีแม้กระทั่งมาตรฐาน) แม้ว่าฉันจะเปลี่ยนการstring.IsNullOrEmpty(s)ตรวจสอบเพื่อโยนข้อยกเว้นเนื่องจากข้อกำหนดเดิมคาดว่าจะมีตัวอักษรตัวแรกอยู่เพื่อให้สามารถพิมพ์ใหญ่ได้ Textboxโปรดทราบว่ารหัสนี้ทำงานสำหรับสตริงทั่วไปและไม่ได้โดยเฉพาะในค่าที่ถูกต้องจาก


2
เนื่องจากพารามิเตอร์แรกของString.Joinคือตัวคั่นที่จะรวมสตริงที่กำหนดด้วยพารามิเตอร์ที่สอง
Dialecticus

27
ฉันชอบคำตอบของคุณ แต่var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);อาจจะเพิ่มความเร็วบ้างเพราะคุณสร้างวัตถุที่ไม่เปลี่ยนรูปน้อย (โดยเฉพาะอย่างยิ่งคุณกำลังกระโดดข้ามString.Join) หลักสูตรนี้ขึ้นอยู่กับความยาวของสตริง
flindeberg

3
ดีเลิศ - การใช้ Linq ทำให้ชัดเจนว่าโค้ดนี้ทำอะไร
Daniel James Bryars

7
อืม ... ในทางเทคนิคแล้วสิ่งนี้น่าจะกลับมา"Argh!"พร้อมกับกฎตัวอักษรตัวพิมพ์ใหญ่ตัวพิมพ์ใหญ่ ;)
jp2code

2
@ jp2code เนื่องจากการใช้อักษรตัวแรกที่ไม่มีตัวตนในสตริงว่างหรือว่างเปล่าก็เหมือนกับการตบปลาโลมาที่ตั้งท้องแล้ว ALL ALL ARPSH! คือการสะกดที่ถูกต้อง urbandictionary.com/define.php?term=ARGH&defid=67839
Carlos Muñoz

319
public string FirstLetterToUpper(string str)
{
    if (str == null)
        return null;

    if (str.Length > 1)
        return char.ToUpper(str[0]) + str.Substring(1);

    return str.ToUpper();
}

คำตอบเก่า: นี่ทำให้ทุกตัวอักษรตัวแรกถึงตัวใหญ่

public string ToTitleCase(string str)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}

แต่สิ่งนี้จะแปลงตัวอักษรตัวแรกของคำทุกคำให้เป็นตัวพิมพ์ใหญ่ไม่ใช่เฉพาะอักขระตัวแรกของสตริง
GvS

@GvS นั่นคือคำถามที่ขอให้คุณทำ
thattolleyguy

17
เขาถามว่า "บ้านแดง" => "บ้านแดง" ToTitleCase จะให้ "Red House" แก่คุณ
GvS

1
เป็นประโยชน์กับฉัน ยอดเยี่ยม
Ehsan Sajjad

1
ไม่แน่ใจเกี่ยวกับสิ่งนี้ แต่อักขระ char + string ทำให้เกิดมวย ในกรณีที่ประสิทธิภาพสูงสุดเป็นข้อกำหนด
nawfal

164

วิธีที่ถูกต้องคือการใช้วัฒนธรรม:

System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())

หมายเหตุ:นี่จะใช้ตัวพิมพ์ใหญ่แต่ละคำภายในสตริงเช่น "บ้านแดง" -> "บ้านแดง" การแก้ปัญหาจะใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในคำเช่น "old McDonald" -> "Old Mcdonald"


4
นี่เป็นวิธีที่เหมาะสมที่สุดที่จะทำแทนที่จะสร้างล้อและลองเขียนเวอร์ชันของคุณเอง
Alexey Shevelyov

12
ปัญหาที่ฉันมีนี่คือมันจะล้างตัวอักษรพิมพ์ใหญ่ที่ใช้ได้ซึ่งอาจเป็นสตริงกลาง เช่น McNames
Jecoms

29
นี่เป็นคำตอบที่ไม่ถูกต้องเนื่องจาก "บ้านแดง" กลายเป็น "บ้านแดง" (สังเกต "H")!
spaark

21
หกปีหลังจากคำถามที่ถูกถามโปรดทำผลงานอย่างละเอียดมากขึ้นของการอ่านคำตอบที่มีอยู่และความคิดเห็นของตน หากคุณมั่นใจว่าคุณมีทางออกที่ดีกว่าให้แสดงสถานการณ์ที่คำตอบของคุณทำงานในแบบที่คุณคิดว่าเหนือกว่าและโดยเฉพาะว่าคำตอบนั้นแตกต่างจากคำตอบที่มีอยู่หรือไม่ 1) Equiso ครอบคลุมตัวเลือกนี้แล้วในช่วงครึ่งหลังของคำตอบของเขา 2) ในหลาย ๆ สถานการณ์ToLowerมันเป็นความผิดพลาดเพราะมันจะลบล้างการใช้อักษรตัวใหญ่กลางคำเช่น "McDonalds" 3) คำถามที่เป็นเรื่องเกี่ยวกับการเปลี่ยนแปลงเพียงคำแรกของสตริง , ไม่เกี่ยวกับ TitleCase
ToolmakerSteve

10
สิ่งนี้จะเปลี่ยนเป็น "กรณีชื่อ" - ดังนั้นจึงเปลี่ยนเป็น "ม้าแดง" เป็น "ม้าแดง" - ในขณะที่มีคนขอระบุอย่างชัดเจนว่าไม่ควรทำเช่นนี้ (และส่งคืน "ม้าแดง") นี่ไม่ใช่วิธีที่ถูกต้อง
Hekkaryk

68

ฉันใช้วิธีที่เร็วที่สุดจากhttp://www.dotnetperls.com/uppercase-first-letterและแปลงเป็นวิธีส่วนขยาย:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty
    /// </summary>
    public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s)
    {
        if (string.IsNullOrEmpty(s))
            return string.Empty;

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

หมายเหตุ: เหตุผลที่ใช้ToCharArrayเร็วกว่าตัวเลือกอื่นchar.ToUpper(s[0]) + s.Substring(1)นั่นคือมีการจัดสรรสตริงเดียวเท่านั้นในขณะที่Substringวิธีการจัดสรรสตริงสำหรับสตริงย่อยจากนั้นสตริงที่สองเพื่อเขียนผลลัพธ์สุดท้าย


แก้ไข : นี่คือสิ่งที่วิธีการนี้ดูเหมือนว่ารวมกับการทดสอบครั้งแรกจากCarlosMuñozตอบรับ :

    /// <summary>
    /// Returns the input string with the first character converted to uppercase
    /// </summary>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrEmpty(s))
            throw new ArgumentException("There is no first letter");

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

ว้าวขอบคุณที่ค้นหาเมตริกประสิทธิภาพเพื่อแสดงโซลูชันที่เหนือกว่า!
ToolmakerSteve

@ToolmakerSteve ฉันชอบวิธีนี้เพราะดูเหมือนว่าจะเร็วกว่าคนอื่น ๆ แต่มีปัญหาเล็กน้อยกับเรื่องนี้ หากคุณผ่านค่า null คุณไม่ควรรับสตริงว่างเปล่าเป็นเอาต์พุต ในความเป็นจริงฉันจะยืนยันว่าแม้ผ่านสตริงว่างเปล่าควรโยนข้อยกเว้นเนื่องจาก OP ขออักษรตัวแรก นอกจากนี้คุณสามารถแสดงความคิดเห็นเกี่ยวกับคำตอบของคนอื่นก่อนที่จะแก้ไข
Carlos Muñoz

@ CarlosMuñoz - มีการพูดคุยกันใน meta ว่าจะ "ปรับปรุง" คำตอบของคนอื่น ฉันทามติคือ "ถ้าคุณสามารถปรับปรุงคำตอบแล้วทำเช่นนั้น - ไม่มีใครเป็นเจ้าของคำตอบไม่ใช่แม้แต่ผู้เขียนต้นฉบับ - เป้าหมายคือเพื่อให้ได้คำตอบที่ดีที่สุด" คุณมีอิสระที่จะแก้ไขหรือย้อนกลับการแก้ไข ในกรณีนี้ความอนุเคราะห์ทั่วไปจะทำให้ผลงานต้นฉบับของผู้เขียนต้นฉบับเป็นผลลัพธ์สุดท้ายและฉันจะตัดสินความคิดเห็น ฉันมักจะยังใส่ในการแสดงความคิดเห็นการเปลี่ยนแปลงฉันทำ; ฉันขอโทษถ้าฉันไม่ได้
ToolmakerSteve

@ CarlosMuñoz - โดยเฉพาะมีคำตอบมากมายใน SO ที่ไม่ได้รับการดูแล หากการเปลี่ยนแปลงจะปรับปรุงคำตอบให้ทิ้งไว้ในความคิดเห็นทำไม หากผู้เขียนติดตามคำตอบอย่างกระตือรือร้นพวกเขาจะทำอย่างไรกับการเปลี่ยนแปลงตามที่เห็นสมควร หากไม่เป็นเช่นนั้นคำตอบจะได้รับการปรับปรุงเพื่อผลประโยชน์ของทุกคน หลักการนี้เป็นจริงโดยเฉพาะอย่างยิ่งสำหรับ Q & A เก่าเช่นนี้
ToolmakerSteve

BTW ฉันเห็นด้วยกับ @ CarlosMuñozเกี่ยวกับการทดสอบในช่วงเริ่มต้นของการทดสอบ - เวอร์ชันการทดสอบของเขานั้นเป็นรูปแบบการเขียนโปรแกรมที่ดีกว่า - ที่return string.Emptyนี่จะซ่อนการเรียกวิธี "เลว"
ToolmakerSteve

46

คุณสามารถใช้ "วิธี ToTitleCase"

string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House

วิธีการขยายนี้แก้ปัญหาทุกรายการ

ใช้งานง่าย

string str = "red house";
str.ToTitleCase();
//result : Red house

string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House

วิธีการ Extention

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Test
{
    public static class StringHelper
    {
        private static CultureInfo ci = new CultureInfo("en-US");
        //Convert all first latter
        public static string ToTitleCase(this string str)
        {
            str = str.ToLower();
            var strArray = str.Split(' ');
            if (strArray.Length > 1)
            {
                strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                return string.Join(" ", strArray);
            }
            return ci.TextInfo.ToTitleCase(str);
        }
        public static string ToTitleCase(this string str, TitleCase tcase)
        {
            str = str.ToLower();
            switch (tcase)
            {
                case TitleCase.First:
                    var strArray = str.Split(' ');
                    if (strArray.Length > 1)
                    {
                        strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                        return string.Join(" ", strArray);
                    }
                    break;
                case TitleCase.All:
                    return ci.TextInfo.ToTitleCase(str);
                default:
                    break;
            }
            return ci.TextInfo.ToTitleCase(str);
        }
    }

    public enum TitleCase
    {
        First,
        All
    }
}

วิธีแก้ไขปัญหาของคุณคือ "บ้านแดง" จะถูกแปลงเป็น "บ้านแดง" และไม่ใช่ "บ้านแดง" ตามที่ถูกถามในคำถาม
Vadim

3
@Tacttin มันจะทำงานได้ แต่รหัสต่อไปนี้ง่ายต่อการอ่านและทำงานได้ดีขึ้น char.ToUpper (ข้อความ [0]) + ((text.Length> 1)? text.Substring (1) .ToLower (): string.Empty) ; คุณสามารถอ่านเพิ่มเติมได้ที่ @ vkreynin.wordpress.com/2013/10/09/…
Vadim

1
ฉันไม่ชอบวิธีแก้ปัญหานี้เพราะมันรวมสถานการณ์ที่แตกต่างกันสองอย่างเข้าด้วยกันเป็นวิธีหนึ่งที่มีความยาว ฉันไม่เห็นประโยชน์เชิงแนวคิดเช่นกัน และการใช้ตัวพิมพ์ใหญ่เพียงตัวอักษรตัวแรกคือ .. ไร้สาระ หากคุณต้องการที่จะใช้ตัวอักษรตัวแรกของการดำเนินงานที่ชัดเจนคือจะเพียงแค่ประโยชน์ (ToUpper) ตัวอักษรตัวแรก แทนที่จะเป็นเช่นนี้ฉันจะมีสองวิธีแยกกัน FirstLetterToUpperในคำตอบของ Equiso (หรือในคำตอบที่ใหม่กว่าของ Guillernet) และToTitleCaseที่นี่ แต่ไม่มีพารามิเตอร์ตัวที่สอง enum TitleCaseจากนั้นไม่จำเป็นต้อง
ToolmakerSteve

31

สำหรับจดหมายฉบับแรกที่มีการตรวจสอบข้อผิดพลาด:

public string CapitalizeFirstLetter(string s)
{
    if (String.IsNullOrEmpty(s))
        return s;
    if (s.Length == 1)
        return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
}

และนี่ก็เหมือนกับส่วนขยายที่มีประโยชน์

public static string CapitalizeFirstLetter(this string s)
    {
    if (String.IsNullOrEmpty(s)) return s;
    if (s.Length == 1) return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
    }

วิธีการที่สะอาด ขอบคุณ!
ฟิลิปป์

11
public static string ToInvarianTitleCase(this string self)
{
    if (string.IsNullOrWhiteSpace(self))
    {
        return self;
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}

6

หากการใช้งานประสิทธิภาพ / หน่วยความจำเป็นปัญหาแล้วสิ่งนี้จะสร้าง StringBuilder เพียงหนึ่ง (1) และ String ใหม่หนึ่ง (1) ขนาดที่มีขนาดเดียวกับสตริงต้นฉบับ

public static string ToUpperFirst(this string str) {
  if( !string.IsNullOrEmpty( str ) ) {
    StringBuilder sb = new StringBuilder(str);
    sb[0] = char.ToUpper(sb[0]);

    return sb.ToString();

  } else return str;
}

3
สิ่งนี้สามารถทำได้ด้วยวิธีง่าย ๆchar[]แทนที่จะมีโครงสร้างพื้นฐานทั้งหมดของStringBuilderมัน แทนnew StringBuilder(str)ใช้str.ToCharArray()และแทนsb.ToString()ใช้new string(charArray)ใช้StringBuilderเลียนแบบชนิดของการจัดทำดัชนีที่อาร์เรย์อักขระแสดงเป็นค่าเริ่มต้นดังนั้น.ToUpperบรรทัดที่แท้จริงอาจเหมือนกัน :-)
Jonathan Gilbert

Darren (หนึ่งปีต่อมา) แสดงวิธีใช้สิ่งนี้ToCharArrayตามที่ @JonathanGilbert แนะนำ
ToolmakerSteve

6

วิธีที่เร็วที่สุด

  private string Capitalize(string s){
        if (string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
}

การทดสอบแสดงผลลัพธ์ถัดไป (สตริงที่มีสัญลักษณ์ 10,000,000 เป็นอินพุต): ผลการทดสอบ


1
ฉันขอแนะนำให้ส่งคืนsพารามิเตอร์เมื่อว่างเปล่าหรือว่างเปล่า
MatrixRonny

4

ลองสิ่งนี้:

static public string UpperCaseFirstCharacter(this string text) {
    return Regex.Replace(text, "^[a-z]", m => m.Value.ToUpper());
}

2
หรือบางทีอาจจะบางส่วนชั้นอื่น ๆ ของตัวละคร (เช่นตัวอักษรและตัวเลข w \) เพื่อให้การทำงานเป็น Unicode ทราบ
Dmitry Ledentsov

@ DmitryLedentsov- คลาสสตริง C # ถูกสร้างขึ้นด้วยอักขระ UTF-16 String Class "แสดงข้อความเป็นลำดับของหน่วยรหัส UTF-16"
ToolmakerSteve

4

หากคุณสนใจเฉพาะอักษรตัวแรกที่ถูกใช้เป็นตัวพิมพ์ใหญ่และมันไม่สำคัญว่าส่วนที่เหลือของสตริงคุณสามารถเลือกตัวอักษรตัวแรกให้ตัวพิมพ์ใหญ่และต่อกับส่วนที่เหลือของสตริงโดยไม่ต้องใช้ตัวอักษรตัวแรก

String word ="red house";
word = word[0].ToString().ToUpper() + word.Substring(1, word.length -1);
//result: word = "Red house"

เราจำเป็นต้องแปลงอักขระตัวแรก ToString () เพราะเราอ่านมันเป็นอาร์เรย์ Char และประเภท Char ไม่มีเมธอด ToUpper ()


3

ต่อไปนี้เป็นวิธีทำเป็นวิธีส่วนขยาย:

static public string UpperCaseFirstCharacter(this string text)
{
    if (!string.IsNullOrEmpty(text))
    {
        return string.Format(
            "{0}{1}",
            text.Substring(0, 1).ToUpper(),
            text.Substring(1));
    }

    return text;
}

สามารถถูกเรียกเช่น:

//yields "This is Brian's test.":
"this is Brian's test.".UpperCaseFirstCharacter(); 

และนี่คือการทดสอบหน่วยสำหรับมัน:

[Test]
public void UpperCaseFirstCharacter_ZeroLength_ReturnsOriginal()
{
    string orig = "";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual(orig, result);
}

[Test]
public void UpperCaseFirstCharacter_SingleCharacter_ReturnsCapital()
{
    string orig = "c";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("C", result);
}

[Test]
public void UpperCaseFirstCharacter_StandardInput_CapitalizeOnlyFirstLetter()
{
    string orig = "this is Brian's test.";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("This is Brian's test.", result);
}

1
string.Formatเป็น overkill; text.Substring(0, 1).ToUpper() + text.Substring(1)ก็ทำ
ToolmakerSteve

3

เนื่องจากฉันกำลังทำงานเกี่ยวกับเรื่องนี้เช่นกันและกำลังมองหาความคิดเห็นใด ๆ นี่เป็นทางออกที่ฉันได้มา มันใช้ LINQ และจะสามารถใช้อักษรตัวแรกของสตริงได้แม้ว่าจะเกิดเหตุการณ์แรกไม่ใช่ตัวอักษรก็ตาม นี่คือวิธีการขยายที่ฉันสร้างขึ้นมา

public static string CaptalizeFirstLetter(this string data)
{
    var chars = data.ToCharArray();

    // Find the Index of the first letter
    var charac = data.First(char.IsLetter);
    var i = data.IndexOf(charac);

    // capitalize that letter
    chars[i] = char.ToUpper(chars[i]);

    return new string(chars);
}

ฉันแน่ใจว่ามีวิธีเพิ่มประสิทธิภาพหรือล้างข้อมูลนี้เล็กน้อย


3

ฉันพบบางสิ่งที่นี่http://www.dotnetperls.com/uppercase-first-letter :

static string UppercaseFirst(string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
    return string.Empty;
}
// Return char and concat substring.
return char.ToUpper(s[0]) + s.Substring(1);
}

บางทีนี่อาจช่วยได้ !!


นี่เป็นการปรับปรุงคำตอบของ Equiso เมื่อ 4 ปีก่อนได้อย่างไร?
ToolmakerSteve

3

ตรวจสอบว่าสตริงนั้นไม่ใช่ null หรือไม่จากนั้นแปลงอักขระตัวแรกเป็นตัวใหญ่และส่วนที่เหลือเป็นตัวพิมพ์เล็ก:

public static string FirstCharToUpper(string str)
{
    return str?.First().ToString().ToUpper() + str?.Substring(1).ToLower();
}

ขอบคุณสำหรับโซลูชันเล็ก ๆ แทนที่จะเป็นโค้ดสองสามบรรทัดสำหรับคำสตริง!
Imran Faruqi

2

สิ่งนี้จะทำแม้ว่าจะทำให้แน่ใจว่าไม่มีเมืองหลวงที่หลงทางซึ่งไม่ได้อยู่ที่จุดเริ่มต้นของคำ

public string(string s)
{
System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-us", false)
System.Globalization.TextInfo t = c.TextInfo;

return t.ToTitleCase(s);
}

2
ต้องมีการตรวจสอบ null sก่อนโทร ToTitleCase
Taras Alenin

@ CarlosMuñoz tlhIngan Hol ไม่มีปลอกตัวอักษรในสคริปต์ :-)
Jonathan Gilbert

2

ดูเหมือนจะมีความซับซ้อนมากมายที่นี่เมื่อคุณต้องการ:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase if a letter
    /// </summary>
    /// <remarks>Null input returns null</remarks>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrWhiteSpace(s))
            return s;

        return char.ToUpper(s[0]) + s.Substring(1);
    }

คะแนนสำคัญ:

  1. มันเป็นวิธีการขยาย

  2. หากอินพุตเป็นโมฆะให้เว้นว่างหรือเว้นวรรคส่งคืนข้อมูลนั้นตามเดิม

  3. String.IsNullOrWhiteSpaceถูกนำมาใช้กับ. NET Framework 4 ซึ่งจะไม่ทำงานกับกรอบงานที่เก่ากว่า


1
ฉันไม่เห็นว่านี่เป็นการปรับปรุงคำตอบเดิมที่ได้รับการยอมรับเมื่อสี่ปีก่อน ในความเป็นจริงมันไม่สอดคล้องกัน (ไม่เป็นอันตราย แต่เมื่อสี่ปีที่แล้วฉันมีมาตรฐานระดับสูงสำหรับคำตอบใหม่ที่เพิ่มประโยชน์): ประโยชน์เพียงอย่างเดียวของการใช้ที่ใหม่IsNullOrWhiteSpaceกว่าไม่ใช่IsNullOrEmptyคือถ้าคุณจะค้นหาและเปลี่ยนสิ่งที่ไม่ใช่ พื้นที่สีขาว แต่คุณทำไม่ได้ - คุณทำงานอยู่s[0]เสมอ ดังนั้นไม่มีจุดหมายมัน [ทั้งความหมายและประสิทธิภาพการทำงาน] IsNullOrWhiteSpaceเพื่อการใช้งาน
ToolmakerSteve

... ทำไมการใช้IsNullOrWhiteSpaceปัญหานี้กับฉันคือผู้อ่านที่ประมาทอาจคิดว่า "เขาตรวจสอบพื้นที่สีขาวดังนั้นรหัสต่อไปนี้จะค้นหาและเปลี่ยนตัวอักษรจริงๆแม้ว่าจะถูกนำหน้าด้วยพื้นที่สีขาว" เนื่องจากรหัสของคุณจะไม่สามารถเปลี่ยนตัวอักษร "ตัวแรก" นำหน้าด้วยช่องว่างสีขาวการใช้IsNullOrWhiteSpaceสามารถทำให้ผู้อ่านเข้าใจผิดเท่านั้น
ToolmakerSteve

... อ๊ะฉันไม่ได้หมายถึงคำตอบที่ยอมรับฉันหมายถึง คำตอบของ Equisoจากช่วงเวลาเดียวกัน
ToolmakerSteve

1
string emp="TENDULKAR";
string output;
output=emp.First().ToString().ToUpper() + String.Join("", emp.Skip(1)).ToLower();

ทำไมต้อง ToLower () ที่ส่วนท้าย? ไม่มีข้อกำหนดสำหรับจดหมายอื่นยกเว้นจดหมายฉบับแรก
Carlos Muñoz

Stringสามารถเป็นอะไรก็ได้UpperหรือLowerดังนั้นจึงเป็นคำตอบทั่วไปสำหรับสตริงทั้งหมด
Shailesh

ทำไมJoinแทนemp.First().ToString().ToUpper() + emp.Substring(1);? อาจต้องมีการป้องกันมากขึ้นเช่นกัน: output = string.IsNullOrEmpty(emp) ? string.Empty : [...]. นอกจากนี้ fwiw เห็นด้วยกับ @ CarlosMuñoz - คุณไม่จำเป็นต้องใช้ToLower()คำถามของ OP
ruffin

@ ruffin -> การใช้Substring ยังเป็นสไตล์การเขียนที่ดีฉันเห็นด้วยกับวิธีการของคุณในการตัดรหัส แต่ในกรณีนี้การเขียน ToLower()เป็นวิธีการเขียนโปรแกรมที่ดี stringสามารถเป็นอะไรก็ได้ในUpperกรณีหรือLowerกรณีขึ้นอยู่กับการป้อนข้อมูลของผู้ใช้ฉันให้โซลูชั่นทั่วไป
Shailesh

@Shailesh - อย่างไรก็ตามคำถามไม่ได้ขอให้มีเพียงตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ ขอให้เปลี่ยนตัวอักษรตัวแรกเป็นทุน โดยไม่ต้องชี้แจงเพิ่มเติมจากผู้เขียนสมมติฐานที่เป็นธรรมชาติที่สุดคือส่วนที่เหลือของสตริงจะไม่เปลี่ยนแปลง เนื่องจากคุณกำลังตอบสามปีต่อมาโปรดสมมติว่าคำตอบที่ยอมรับนั้นเป็นสิ่งที่ผู้ขอร้องขอ ให้คำตอบที่ต่างกันก็ต่อเมื่อมีเหตุผลทางเทคนิคที่แตกต่างกัน
ToolmakerSteve

1

ฉันต้องการให้คำตอบ "ประสิทธิภาพสูงสุด" ในความคิดของฉันคำตอบ "ประสิทธิภาพสูงสุด" จะจับภาพสถานการณ์ทั้งหมดและให้คำตอบสำหรับการบัญชีคำถามสำหรับสถานการณ์เหล่านั้น ดังนั้นนี่คือคำตอบของฉัน ด้วยเหตุผลเหล่านี้:

  1. IsNullOrWhiteSpace บัญชีสำหรับสตริงที่เป็นเพียงช่องว่างหรือโมฆะ / ว่างเปล่า
  2. .Trim () ลบช่องว่างออกจากด้านหน้าและด้านหลังของสตริง
  3. .First () ใช้อักขระตัวแรกของ ienumerable (หรือสตริง)
  4. เราควรตรวจสอบดูว่าเป็นจดหมายที่สามารถ / ควรเป็นตัวพิมพ์ใหญ่หรือไม่
  5. จากนั้นเราจะเพิ่มส่วนที่เหลือของสตริงเฉพาะในกรณีที่ความยาวบ่งชี้ว่าเราควร
  6. โดย. NET แนวปฏิบัติที่ดีที่สุดเราควรจัดเตรียมวัฒนธรรมภายใต้ System.Globalization.CultureInfo
  7. ทำให้พวกเขาเป็นพารามิเตอร์เสริมทำให้วิธีนี้สามารถนำมาใช้ใหม่ได้อย่างสมบูรณ์โดยไม่ต้องพิมพ์วัฒนธรรมที่เลือกทุกครั้ง

    public static string capString(string instring, string culture = "en-US", bool useSystem = false)
    {
        string outstring;
        if (String.IsNullOrWhiteSpace(instring))
        {
            return "";
        }
        instring = instring.Trim();
        char thisletter = instring.First();
        if (!char.IsLetter(thisletter))
        {
            return instring;   
        }
        outstring = thisletter.ToString().ToUpper(new CultureInfo(culture, useSystem));
        if (instring.Length > 1)
        {
            outstring += instring.Substring(1);
        }
        return outstring;
    }

2
ในขณะนี้ครอบคลุมกรณีส่วนใหญ่มันจะค่อนข้างช้าเมื่อพิจารณาจากจำนวนสตริงที่ถูกสร้างขึ้นกับการดำเนินงานแต่ละครั้ง? มีการจัดสรรสตริงจำนวนมากเกิดขึ้นที่นี่ โดยเฉพาะอย่างยิ่งมันจะถูกจัดสรรครั้งเดียวและครั้งเดียวเท่านั้น
Douglas Gaskell

1

เมื่อเร็ว ๆ นี้ฉันมีความต้องการที่คล้ายกันและจำได้ว่าฟังก์ชั่น LINQ Select () ให้ดัชนี:

string input;
string output;

input = "red house";
output = String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
//output = "Red house"

เนื่องจากฉันต้องการที่บ่อยมากฉันทำวิธีการขยายสำหรับประเภทสตริง:

public static class StringExtensions
{
    public static string FirstLetterToUpper(this string input)
    {
        if (string.IsNullOrEmpty(input))
            return string.Empty;
        return String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
    }
}

โปรดทราบว่าตัวอักษรตัวแรกเท่านั้นที่ถูกแปลงเป็นตัวพิมพ์ใหญ่ - ตัวอักษรที่เหลือทั้งหมดจะไม่ได้สัมผัส หากคุณต้องการให้ตัวละครอื่นเป็นตัวพิมพ์เล็กคุณอาจเรียก Char.ToLower (currentChar) เพื่อหาดัชนี> 0 หรือโทร ToLower () บนสตริงทั้งหมดในที่แรก

เกี่ยวกับประสิทธิภาพฉันเปรียบเทียบโค้ดกับโซลูชันจาก Darren บนเครื่องของฉันรหัสของ Darren เร็วขึ้นประมาณ 2 เท่าซึ่งไม่น่าแปลกใจเพราะเขาแก้ไขเฉพาะอักษรตัวแรกในอาร์เรย์เท่านั้น ดังนั้นฉันขอแนะนำให้คุณใช้รหัสของ Darren หากคุณต้องการวิธีแก้ปัญหาที่เร็วที่สุด หากคุณต้องการรวมการจัดการสตริงอื่น ๆ ด้วยเช่นกันมันอาจจะสะดวกในการแสดงพลังของฟังก์ชั่นแลมบ์ดาที่สัมผัสกับตัวอักษรของสตริงป้อนเข้า - คุณสามารถขยายฟังก์ชั่นนี้ได้อย่างง่ายดาย


ฉันสงสัยว่าฉันจะแก้ปัญหานี้ได้อย่างไรใช้วิธีแก้ปัญหาของฉันเองแล้วกลับมาโพสต์เฉพาะเพื่อค้นหาว่าคุณมีวิธีแก้ไขปัญหาเดียวกับที่ฉันมีอยู่แล้ว +1 ถึงคุณ!
BlueFuzzyThing

ขอบคุณมาก.
กริมม์

1

ฉันคิดว่าวิธีการด้านล่างเป็นทางออกที่ดีที่สุด

    class Program
{
    static string UppercaseWords(string value)
    {
        char[] array = value.ToCharArray();
        // Handle the first letter in the string.
        if (array.Length >= 1)
        {
            if (char.IsLower(array[0]))
            {
                array[0] = char.ToUpper(array[0]);
            }
        }
        // Scan through the letters, checking for spaces.
        // ... Uppercase the lowercase letters following spaces.
        for (int i = 1; i < array.Length; i++)
        {
            if (array[i - 1] == ' ')
            {
                if (char.IsLower(array[i]))
                {
                    array[i] = char.ToUpper(array[i]);
                }
            }
        }
        return new string(array);
    }

    static void Main()
    {
        // Uppercase words in these strings.
        const string value1 = "something in the way";
        const string value2 = "dot net PERLS";
        const string value3 = "String_two;three";
        const string value4 = " sam";
        // ... Compute the uppercase strings.
        Console.WriteLine(UppercaseWords(value1));
        Console.WriteLine(UppercaseWords(value2));
        Console.WriteLine(UppercaseWords(value3));
        Console.WriteLine(UppercaseWords(value4));
    }
}

Output

Something In The Way
Dot Net PERLS
String_two;three
 Sam

อ้าง


1

เนื่องจากคำถามนี้เกี่ยวกับการเพิ่มประสิทธิภาพฉันจึงปรับใช้เวอร์ชันของ Darren เพื่อใช้Spans ซึ่งลดขยะและปรับปรุงความเร็วประมาณ 10%

        /// <summary>
        /// Returns the input string with the first character converted to uppercase
        /// </summary>
        public static string ToUpperFirst(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            Span<char> a = stackalloc char[s.Length];
            s.AsSpan(1).CopyTo(a.Slice(1));
            a[0] = char.ToUpper(s[0]);
            return new string(a);
        }

ประสิทธิภาพ

|  Method |      Data |      Mean |     Error |    StdDev |
|-------- |---------- |----------:|----------:|----------:|
|  Carlos |       red | 107.29 ns | 2.2401 ns | 3.9234 ns |
|  Darren |       red |  30.93 ns | 0.9228 ns | 0.8632 ns |
| Marcell |       red |  26.99 ns | 0.3902 ns | 0.3459 ns |
|  Carlos | red house | 106.78 ns | 1.9713 ns | 1.8439 ns |
|  Darren | red house |  32.49 ns | 0.4253 ns | 0.3978 ns |
| Marcell | red house |  27.37 ns | 0.3888 ns | 0.3637 ns |

รหัสทดสอบเต็มรูปแบบ

using System;
using System.Linq;

using BenchmarkDotNet.Attributes;

namespace CorePerformanceTest
{
    public class StringUpperTest
    {
        [Params("red", "red house")]
        public string Data;

        [Benchmark]
        public string Carlos() => Data.Carlos();

        [Benchmark]
        public string Darren() => Data.Darren();

        [Benchmark]
        public string Marcell() => Data.Marcell();
    }

    internal static class StringExtensions
    {
        public static string Carlos(this string input) =>
            input switch
            {
                null => throw new ArgumentNullException(nameof(input)),
                "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
                _ => input.First().ToString().ToUpper() + input.Substring(1)
            };

        public static string Darren(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            char[] a = s.ToCharArray();
            a[0] = char.ToUpper(a[0]);
            return new string(a);
        }

        public static string Marcell(this string s)
        {
            if (string.IsNullOrEmpty(s))
                throw new ArgumentException("There is no first letter");

            Span<char> a = stackalloc char[s.Length];
            s.AsSpan(1).CopyTo(a.Slice(1));
            a[0] = char.ToUpper(s[0]);
            return new string(a);
        }
    }

}

แก้ไข: มีแบบอักษรแทน s [0], เป็นแบบ [0] - ผลลัพธ์นี้มีการคิวรูเดียวกัน, ค่าว่างเปล่าไปยัง Span a ที่จัดสรรไว้


0

นี่เป็นตัวพิมพ์ใหญ่ตัวอักษรตัวแรกและตัวอักษรทุกตัวที่ตามหลังเว้นวรรคและตัวพิมพ์เล็กอักษรอื่นใด ๆ

public string CapitalizeFirstLetterAfterSpace(string input)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder(input);
    bool capitalizeNextLetter = true;
    for(int pos = 0; pos < sb.Length; pos++)
    {
        if(capitalizeNextLetter)
        {
            sb[pos]=System.Char.ToUpper(sb[pos]);
            capitalizeNextLetter = false;
        }
        else
        {
            sb[pos]=System.Char.ToLower(sb[pos]);
        }

        if(sb[pos]=' ')
        {
            capitalizeNextLetter=true;
        }
    }
}

1
หรือถ้าคุณไม่ต้องการเขียนวอลล์ของรหัส - CultureInfo.CurrentCulture.TextInfo.ToTitleCase (theString); ทำสิ่งเดียวกัน
Chev

ใช่ ... ฉันไม่รู้เรื่องนั้น :) และเนื่องจากรหัสจำนวนมหาศาลของฉันคำตอบของคนอื่น ๆ ก็โผล่ขึ้นมาในขณะที่ฉันยังพิมพ์อยู่
thattolleyguy

ได้รับการปรับปรุง: 1) ความแตกต่างเล็กน้อยระหว่างคำตอบนี้และ ToTitleCase คือคำตอบนี้บังคับให้คำที่เป็นตัวพิมพ์ใหญ่ทั้งหมดกลายเป็น TitleCase ในขณะที่ ToTitleCase ออกจากคำพูดนี้เพียงอย่างเดียว (สมมติว่าพวกเขาอาจเป็นตัวย่อ) นี่อาจเป็นหรืออาจเป็นสิ่งที่ต้องการ ข้อดีของการมีตัวอย่างรหัสเช่นนี้คือสามารถแก้ไขได้ตามต้องการ 2) สิ่งนี้จะไม่จัดการพื้นที่สีขาวที่ไม่ใช่ '' อย่างถูกต้อง ควรแทนที่การทดสอบว่างด้วยการทดสอบช่องว่าง
ToolmakerSteve

0

ใช้รหัสต่อไปนี้:

string  strtest ="PRASHANT";
strtest.First().ToString().ToUpper() + strtest.Remove(0, 1).ToLower();

มันไม่คุ้มค่าที่ชี้ไปที่ตัวแทนของฉันเพื่อลดคำตอบนี้เพิ่มหลายปีต่อมาซึ่งเทียบเท่ากับคำตอบที่มีอยู่แล้ว หากคุณกำลังจะเพิ่มคำตอบใหม่สำหรับคำถามที่มีคำตอบมากมายโปรดอธิบายสิ่งที่คุณเชื่อว่าเหนือกว่าคำตอบของคุณหรือในสถานการณ์ใดที่คำตอบของคุณจะมีประโยชน์มากกว่าคำตอบอื่น ๆ เฉพาะเจาะจง.
ToolmakerSteve

0

ดูเหมือนว่าไม่มีวิธีแก้ปัญหาใดที่ให้ไว้ที่นี่จะจัดการกับพื้นที่สีขาวก่อนที่จะสตริง

เพียงเพิ่มสิ่งนี้เป็นความคิด:

public static string SetFirstCharUpper2(string aValue, bool aIgonreLeadingSpaces = true)
{
    if (string.IsNullOrWhiteSpace(aValue))
        return aValue;

    string trimmed = aIgonreLeadingSpaces 
           ? aValue.TrimStart() 
           : aValue;

    return char.ToUpper(trimmed[0]) + trimmed.Substring(1);
}   

มันควรจัดการthis won't work on other answers(ประโยคนั้นมีช่องว่างในตอนเริ่มต้น) และถ้าคุณไม่ชอบการตัดแต่งพื้นที่เพียงแค่ส่งผ่านfalseพารามิเตอร์ตัวที่สอง (หรือเปลี่ยนค่าเริ่มต้นเป็นfalseและผ่านtrueหากคุณต้องการจัดการกับช่องว่าง)



0

วิธีที่ง่ายที่สุดในการใช้ประโยชน์จากจดหมาย firs คือ:

1- การใช้ Sytem.Globalization

  // Creates a TextInfo based on the "en-US" culture.
  TextInfo myTI = new CultureInfo("en-US",false).

  myTI.ToTitleCase(textboxname.Text)

`


1
คำตอบนี้เหมือนกันกับคำตอบเมื่อหลายปีก่อน มันไม่มีอะไรเพิ่มเติมในการสนทนา
ToolmakerSteve

มันเป็นความผิดเช่นเดียวกับความคิดเห็นในอีกด้านหนึ่งซึ่งจะเปลี่ยนทุกตัวอักษรตัวแรกในทุกคำไม่ใช่ตัวอักษรตัวใหญ่เช่น Red House แทนที่จะเป็น Red House
DeadlyChambers

0

ฟังก์ชั่นต่อไปนี้ถูกต้องสำหรับทุกวิธี:

static string UppercaseWords(string value)
{
    char[] array = value.ToCharArray();
    // Handle the first letter in the string.
    if (array.Length >= 1)
    {
        if (char.IsLower(array[0]))
        {
            array[0] = char.ToUpper(array[0]);
        }
    }
    // Scan through the letters, checking for spaces.
    // ... Uppercase the lowercase letters following spaces.
    for (int i = 1; i < array.Length; i++)
    {
        if (array[i - 1] == ' ')
        {
            if (char.IsLower(array[i]))
            {
                array[i] = char.ToUpper(array[i]);
            }
        }
    }
    return new string(array);
}

ฉันพบว่าที่นี่


ทำไม? ทำไมต้องเพิ่มอีกคำตอบเมื่อมีคำตอบมากมายที่คล้ายกันอยู่แล้ว? เกิดอะไรขึ้นกับคำตอบที่มีอยู่ทั้งหมดซึ่งทำให้คุณเพิ่มคำตอบใหม่
ToolmakerSteve

เพราะมันเป็นสิ่งที่ถูกต้องสำหรับทุกวิถีทาง ใช้ง่าย

ฉันขอโทษ; ฉันรุนแรงโดยไม่จำเป็น ฉันจะยึดติดกับข้อเท็จจริง: 1) นี่เป็นสิ่งเดียวกับคำตอบนั้นเมื่อเวลาผ่านไปเจ็ดปี 2) สิ่งนี้มีข้อบกพร่องเช่นเดียวกับคำตอบนั้น: ไม่ได้จัดการพื้นที่สีขาวที่ไม่ใช่ตัวอักษรว่างเปล่า 3) คำตอบนี้เป็นคำถามที่แตกต่างจาก OP เล็กน้อย ใช้คำตอบเช่นนี้หากคุณต้องการให้ทุกคำมีอักษรตัวใหญ่เป็นตัวพิมพ์ใหญ่ 4) โดยปกติแล้ววิธีที่ง่ายกว่าในการทำให้สำเร็จคือใช้ TitleInfo.ToTitleCase (ในทางกลับกันข้อดีของตัวอย่างโค้ดสามารถปรับแต่งได้ตามต้องการ)
ToolmakerSteve

การแก้ไขตัวเอง: สิ่งนี้แตกต่างจากวิธีการของทิมเลย์ฮวี: มันทิ้งตัวอักษรที่ไม่ได้แตะต้องไว้ซึ่งไม่ใช่ตัวอักษรตัวแรกของคำ แต่มันเป็นซ้ำของคำตอบของ zamoldar ในความโปรดปรานรุ่งโรจน์ถึง Darian ที่ให้ลิงก์ไปยังแหล่งที่มา - ดูเหมือนว่า zamoldar จะลอกเลียนแบบโดยไม่ให้เครดิต เนื่องจากการให้ลิงค์แหล่งข้อมูลนั้นและปรับปรุงการสนทนาฉันจึงพยายามตอบคำถามนี้แม้ว่าจะมีการวิจารณ์ก็ตาม
ToolmakerSteve

1
Darian การปรับปรุงสองอย่างที่สามารถทำได้: 1) ใช้char.IsWhiteSpace( array[ i -1 ] )แทน.. == ' 'เพื่อจัดการพื้นที่สีขาวทั้งหมด 2) ลบสถานที่ทั้งสองที่ทำif (char.isLower(..))- พวกเขาไม่มีจุดประสงค์ ToUpperไม่ทำอะไรเลยถ้าตัวละครไม่ใช่ตัวพิมพ์เล็ก
ToolmakerSteve

0

ขยายคำถามของคาร์ลอสด้านบนหากคุณต้องการใช้ประโยชน์จากหลาย ๆ ประโยคคุณอาจใช้รหัสนี้:

    /// <summary>
    /// Capitalize first letter of every sentence. 
    /// </summary>
    /// <param name="inputSting"></param>
    /// <returns></returns>
    public string CapitalizeSentences (string inputSting)
    {
        string result = string.Empty;
        if (!string.IsNullOrEmpty(inputSting))
        {
            string[] sentences = inputSting.Split('.');

            foreach (string sentence in sentences)
            {
                result += string.Format ("{0}{1}.", sentence.First().ToString().ToUpper(), sentence.Substring(1)); 
            }
        }

        return result; 
    }

0

แนวทางแก้ไขที่เป็นไปได้ในการแก้ไขปัญหาของคุณ

   public static string FirstToUpper(this string lowerWord)
   {
       if (string.IsNullOrWhiteSpace(lowerWord) || string.IsNullOrEmpty(lowerWord))
            return lowerWord;
       return new StringBuilder(lowerWord.Substring(0, 1).ToUpper())
                 .Append(lowerWord.Substring(1))
                 .ToString();
   }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.