วิธีรับอักขระห้าตัวแรกของสตริง


135

ฉันได้อ่านคำถามนี้เพื่อรับอักขระแรกของสตริง มีวิธีรับ n จำนวนอักขระแรกจากสตริงใน C # หรือไม่?


คำถามก่อนหน้านี้ถามเกี่ยวกับchar** s และคุณกำลังถามเกี่ยวกับ ** character s พวกเขาไม่ใช่สิ่งเดียวกัน 𣊾และ𣇞เป็นอักขระสองตัวที่ฉันต้องใช้เมื่อวานนี้ซึ่งล้มเหลวในซอฟต์แวร์ที่เขียนด้วย C # ที่ฉันใช้เพราะโปรแกรมเมอร์ไม่รู้ความแตกต่างระหว่างcharอักขระ a และอักขระ อย่าตกหลุมพรางนี้!
hippietrail

คำตอบ:


221

คุณสามารถใช้Enumerableชอบ:

char[] array = yourStringVariable.Take(5).ToArray();

หรือคุณสามารถใช้String.Substring

string str = yourStringVariable.Substring(0,5);

โปรดจำไว้ว่าString.Substringอาจทำให้เกิดข้อยกเว้นในกรณีที่ความยาวของสตริงน้อยกว่าอักขระที่ต้องการ

หากคุณต้องการรับผลลัพธ์กลับเป็นสตริงคุณสามารถใช้:

  • ใช้ String Constructor และ LINQ's Take

    string firstFivChar = new string(yourStringVariable.Take(5).ToArray());
    

การบวกด้วยวิธีการไม่ได้ตรวจสอบความยาวก่อนมือ

  • อีกวิธีหนึ่งคือใช้String.Substringกับการตรวจสอบข้อผิดพลาด

ชอบ:

string firstFivCharWithSubString = 
    !String.IsNullOrWhiteSpace(yourStringVariable) && yourStringVariable.Length >= 5
    ? yourStringVariable.Substring(0, 5)
    : yourStringVariable;

3
string val = สตริงใหม่ (yourStringVariable.Take (6) .ToArray ()); แต่ Substring จะผิดพลาดหากความยาวของ YourStringVariable น้อยกว่า 5
Moji

1
IsNullOrWhiteSpaceผิดที่นี่ พิจารณาสตริงที่มีช่องว่าง 10 ช่อง - รหัสของคุณจะส่งคืนทั้งหมด 10 ใช้IsNullOrEmptyแทน (ไม่เป็นการดีที่จะรวมIsNullOrWhiteSpaceกับการทดสอบอื่น ๆ แต่ให้ทดสอบ null + ว่างแทนTrimหากเป็นพฤติกรรมที่ระบุให้ทำการทดสอบ / การดำเนินการใด ๆ ที่จำเป็น)
ToolmakerSteve

1
คุณสามารถบันทึกการโทรไปยัง ToArray () โดยใช้ String.Concat () ดังนี้: string firstFivChar = String.Concat (yourStringVariable.Take (5));
BlueFuzzyThing

50

โปรดลอง:

yourString.Substring(0, 5);

ตรวจสอบC # Substring , String.Substring Method


สิ่งนี้จะผ่านข้อยกเว้นหากความยาวyourStringน้อยกว่า 5 เพื่อหลีกเลี่ยงข้อยกเว้นเราสามารถสตริงย่อยตามเงื่อนไขเช่นyourString.Length <= 5 ? yourString : yourString.Substring(0, 5)
Zaheer

38

คุณสามารถใช้Substring (int startIndex, int length)

string result = str.Substring(0,5);

สตริงย่อยเริ่มต้นที่ตำแหน่งอักขระที่ระบุและมีความยาวที่ระบุ วิธีนี้ไม่ได้แก้ไขค่าของอินสแตนซ์ปัจจุบัน แต่จะส่งคืนสตริงใหม่ที่มีอักขระความยาวโดยเริ่มจากตำแหน่ง startIndex ในสตริงปัจจุบัน MSDN

จะเกิดอะไรขึ้นถ้าสตริงต้นทางน้อยกว่าห้าอักขระ คุณจะได้รับข้อยกเว้นโดยใช้วิธีการข้างต้น เราสามารถวางเงื่อนไขเพื่อตรวจสอบว่าจำนวนอักขระในสตริงมากกว่า 5 หรือไม่แล้วรับห้าตัวแรกผ่าน Substring หมายเหตุฉันได้กำหนดสตริงต้นทางให้กับตัวแปร firstFiveChar FirstFiveChar จะไม่เปลี่ยนแปลงหากอักขระน้อยกว่า 5 ดังนั้นจึงไม่จำเป็นต้องใช้ส่วนอื่น

string firstFiveChar = str;
If(!String.IsNullOrWhiteSpace(yourStringVariable) && yourStringVariable.Length >= 5)
      firstFiveChar = yourStringVariable.Substring(0, 5);

31

ไม่มีใครพูดถึงวิธีการตรวจสอบที่เหมาะสมเมื่อใช้Substring()งานดังนั้นฉันจึงต้องการมีส่วนร่วมในเรื่องนี้

หากคุณไม่ต้องการใช้Linqและไปด้วยSubstring()คุณต้องแน่ใจว่าสตริงของคุณใหญ่กว่าพารามิเตอร์ตัวที่สอง (ความยาว) ของSubstring()ฟังก์ชัน

สมมติว่าคุณต้องมีอักขระ 5 ตัวแรก คุณควรได้รับการตรวจสอบที่เหมาะสมดังนี้:

string title = "love" // 15 characters
var firstFiveChars = title.Length <= 5 ? title : title.Substring(0, 5);

// firstFiveChars: "love" (4 characters)

หากไม่มีการตรวจสอบนี้Substring()ฟังก์ชันจะทำให้เกิดข้อยกเว้นเนื่องจากมันจะวนซ้ำตัวอักษรที่ไม่มีอยู่

ฉันคิดว่าคุณคงเข้าใจ ...


ข้อมูลเพิ่มเติมที่น่ารัก
Rob85

ฉันดีใจที่คุณชอบมัน
ilter

สิ่งนี้ช่วยฉันได้มาก แต่คุณช่วยอธิบายได้ไหมว่ามันทำอะไรในบรรทัดนั้น?
jimbob

ฉันจะตรวจสอบตัวอย่างเกี่ยวกับสตริงย่อย ต้องใช้พารามิเตอร์สำหรับดัชนี ดัชนีเริ่มต้นคือ 0 ถ้าคุณเขียนอะไรที่ใหญ่กว่า (หรือเล็กกว่าสำหรับเรื่องนั้น) กว่าดัชนีสุดท้ายของอาร์เรย์ใด ๆ คุณจะได้รับข้อยกเว้นของดัชนี การตรวจสอบนั้นในตัวอย่างมีไว้เพื่อหลีกเลี่ยงข้อยกเว้นนั้น
ilter

ฮะฮะฮะ! :) มันเป็นคำถามที่ฉันตอบ ฉันควรปล่อยให้คำถามนั้นยังไม่มีคำตอบหรือไม่? :)
ilter

18

ปัญหา.Substring(,)คือคุณต้องแน่ใจว่าสตริงที่กำหนดมีความยาวอย่างน้อยของจำนวนอักขระที่ถามมิฉะนั้นArgumentOutOfRangeExceptionจะถูกโยนทิ้ง

โซลูชันที่ 1 (โดยใช้ 'Substring'):

var firstFive = stringValue != null ? 
                   stringValue.Substring(0, stringValue.Length >= 5 ? 5 : stringValue.Length) :
                   null;

ข้อเสียของการใช้.Substring(คือคุณจะต้องตรวจสอบความยาวของสตริงที่กำหนด

โซลูชันที่ 2 (โดยใช้ 'Take'):

var firstFive = stringValue != null ? 
                    string.Join("", stringValue.Take(5)) : 
                    null;

การใช้'Take'จะป้องกันไม่ให้คุณต้องตรวจสอบความยาวของสตริงที่กำหนด


13

ใช้ฟังก์ชัน PadRight เพื่อป้องกันไม่ให้สตริงสั้นเกินไปคว้าสิ่งที่คุณต้องการจากนั้นตัดช่องว่างจากส่วนท้ายทั้งหมดในคำสั่งเดียว

strSomeString = strSomeString.PadRight(50).Substring(0,50).TrimEnd();

1
นี่เป็นทางออกที่ดีกว่าจนถึงตอนนี้ การใช้เพียง Substring อาจทำให้เกิดข้อผิดพลาดเมื่อความยาวของสตริงต่ำกว่าความยาวสตริงย่อย
Asiri Dissanayaka

ทางเลือกที่ดีที่สุดสำหรับฟังก์ชัน LEFT ที่เราใช้ใน SQL Server
vibs2006

12

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

string str = yourString.Remove(n);

n - จำนวนอักขระที่คุณต้องการ

ตัวอย่าง

var zz = "7814148471";
Console.WriteLine(zz.Remove(5));
//result - 78141

3
ภายในจะเหมือนกับ "this.Substring (0, 5)" ดังนั้นคุณต้องตรวจสอบให้แน่ใจว่าสตริงมีความยาวที่เหมาะสม
PersyJack

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

10

ต่อท้ายอักขระช่องว่างห้าตัวจากนั้นตัดห้าตัวแรกและตัดแต่งผลลัพธ์ จำนวนช่องว่างที่คุณต่อท้ายควรตรงกับจำนวนที่คุณกำลังตัด อย่าลืมใส่วงเล็บไว้ก่อน.Substring(0,X)ไม่เช่นนั้นคุณจะไม่ต้องต่อท้าย

string str = (yourStringVariable + "    ").Substring(0,5).Trim();

ด้วยเทคนิคนี้คุณจะไม่ต้องกังวลกับArgumentOutOfRangeExceptionคำตอบอื่น ๆ ที่กล่าวถึง


1
ฉันจะโพสต์ว่า !! โหวตแล้ว (มันเป็นปี 2019 ทำไมไม่มีวิธีการบนสตริงที่ทำในสิ่งที่ Mid $ ทำในปี 1985 สำหรับคนที่พูดว่า 'คุณไม่ควรทำอย่างนั้น' ตกลงคุณมาเขียนโค้ดให้ฉัน ... คุณจะต้อง ทำมัน ... )
FastAl

8

โปรดทราบว่ามีวิธีใหม่ในการดำเนินการนี้ใน C # 8.0: ตัวดำเนินการช่วง

Microsoft Docs

หรือที่ฉันชอบเรียกว่า em, Pandas slices

วิธีเก่า:

string newString = oldstring.Substring(0, 5);

วิธีการใหม่:

string newString = oldstring[..5];

ซึ่งเมื่อมองแวบแรกดูเหมือนจะเป็นการแลกเปลี่ยนความสามารถในการอ่านโค้ดที่สั้นกว่า แต่คุณลักษณะใหม่นี้ให้คุณ

  1. ไวยากรณ์มาตรฐานสำหรับการแบ่งอาร์เรย์ (ดังนั้นสตริง)
  2. ของเด็ด ๆ แบบนี้:

    var slice1 = รายการ [2 .. ^ 3]; // รายการ [Range.Create (2, Index.CreateFromEnd (3))]

    var slice2 = รายการ [.. ^ 3]; // รายการ [Range ToEnd (Index.CreateFromEnd (3))]

    var slice3 = รายการ [2 .. ]; // รายการ [Range.FromStart (2)]

    var slice4 = รายการ [.. ]; // รายการ [ช่วงทั้งหมด]


7
string str = "GoodMorning"

string strModified = str.Substring(0,5);

2
จะผิดพลาดหากความยาวของตัวแปร "str" ​​น้อยกว่า 5
Moji

3

เพื่อรับ n จำนวนอักขระแรกจากสตริงใน C #

String yourstring="Some Text";  
String first_n_Number_of_Characters=yourstring.Substring(0,n);

2

ด้านล่างนี้เป็นวิธีการขยายที่ตรวจสอบว่าสตริงใหญ่กว่าที่ต้องการหรือไม่และย่อสตริงให้เป็นจำนวนอักขระสูงสุดที่กำหนดและต่อท้าย "... "

public static class StringExtensions
{
    public static string Ellipsis(this string s, int charsToDisplay)
    {
        if (!string.IsNullOrWhiteSpace(s))
            return s.Length <= charsToDisplay ? s : new string(s.Take(charsToDisplay).ToArray()) + "...";
        return String.Empty;
    }
}


1

ฉันใช้:

var firstFive = stringValue?.Substring(0, stringValue.Length >= 5 ? 5 : customAlias.Length);

หรือทางเลือกอื่นหากคุณต้องการตรวจสอบ Whitespace ด้วย (แทนที่จะเป็น Null เท่านั้น):

var firstFive = !String.IsNullOrWhiteSpace(stringValue) && stringValue.Length >= 5 ? stringValue.Substring(0, 5) : stringValue

1

หรือคุณอาจจะใช้String.ToCharArray ()
ใช้เวลาint startindexและและint lengthเป็นพารามิเตอร์และส่งคืน achar[]

new string(stringValue.ToCharArray(0,5))

คุณยังคงต้องตรวจสอบให้แน่ใจว่าสตริงมีความยาวที่เหมาะสมมิฉะนั้นจะทำให้เกิดความเสียหาย ArgumentOutOfRangeException



1

นี่คือวิธีที่คุณทำได้ในปี 2020:

var s = "ABCDEFGH";
var first5 = s.AsSpan(0, 5);

Span <T>จุดโดยตรงกับหน่วยความจำของสตริงหลีกเลี่ยงการจัดสรรสตริงชั่วคราว แน่นอนว่าวิธีการใด ๆ ที่ตามมาเพื่อขอstringการแปลงจำเป็น

Console.WriteLine(first5.ToString());

แม้ว่าวันนี้หลาย ๆ .NET APIอนุญาตให้มีช่วงได้ ติดไว้ถ้าทำได้!

หมายเหตุ:หากการกำหนดเป้าหมาย.NET Frameworkเพิ่มการอ้างอิงไปยังแพ็กเกจSystem.Memoryแต่อย่าคาดหวังประสิทธิภาพที่ยอดเยี่ยมเช่นเดียวกัน


เราต้องดูเวอร์ชัน. net ก่อนใช้จริง ๆAsSpan
Zaheer

"ในปี 2020" สวยมากหมายความว่าคุณกำหนดเป้าหมายหรืออย่างน้อย.NET 5 .NET Coreอย่างไรก็ตามมันใช้งานได้.NET Framework 4.5+หากคุณเพิ่มการอ้างอิงบางอย่าง
l33t



-3

ฉันได้ลองคำตอบข้างต้นแล้วและสิ่งที่ดีที่สุดที่ฉันคิดว่าเป็นคำตอบนี้

@item.First_Name.Substring(0,1)

ในนี้ฉันจะได้อักษรตัวแรกของสตริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.