วิธีใดในคลาส String ที่ส่งกลับเฉพาะอักขระ N ตัวแรก


184

ฉันต้องการเขียนวิธีการขยายไปยังStringชั้นเรียนเพื่อที่ว่าถ้าสายอักขระการป้อนข้อมูลมีความยาวเกินความยาวที่กำหนดNไว้เฉพาะNอักขระตัวแรกเท่านั้นที่จะถูกแสดง

นี่คือลักษณะ:

public static string TruncateLongString(this string str, int maxLength)
{
    if (str.Length <= maxLength)
        return str;
    else
        //return the first maxLength characters                
}

สิ่งที่String.*()วิธีที่ฉันสามารถใช้เพื่อให้ได้เพียงครั้งแรกNของตัวละครstr?

คำตอบ:


374
public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str))
        return str;
    return str.Substring(0, Math.Min(str.Length, maxLength));
}

6
Math.Min จำเป็นหรือไม่ ฉันคิดว่า Substring รู้ว่าหากพารามิเตอร์ตัวที่สองมีค่ามากกว่าความยาว
Martin

12
ฉันเชื่อว่ามันคือ: ระบบ. ภายใน. วงในกับตัวตรวจสอบจะโยน ArgumentOutOfRange
Paul Ruane

2
@ Martin: ไม่ใช่ว่าผมสามารถดูพ่นstartIndex > (this.Length - length) ArgumentOutOfRangeException
7116

2
ฉันจะแนะนำให้ตรวจสอบว่าMath.Min(str.Length, maxLength) == str.Lengthในกรณีที่คุณจบลงด้วยการสร้างสตริงที่ไม่จำเป็นที่จะกลับมา "str.Length อักขระของ str" ตัวแรก แต่สตริงย่อยจะตรวจสอบว่าคุณและเพียงแค่return thisถ้าคุณขอให้ทั้งสตริง
stevemegson

2
หากคุณต้องการวิธีการขยายการทำงานกับสตริงที่เป็นโมฆะ ... ส่งกลับ str? .Substring (0, Math.Min (str.Length, maxLength));
ihake

62
string truncatedToNLength = new string(s.Take(n).ToArray());  

วิธีการแก้ปัญหานี้มีโบนัสเล็กน้อยในกรณีที่ n มากกว่า s.Length ก็ยังคงทำสิ่งที่ถูกต้อง


9
ใช่ แต่ใช้ Linq เพื่อตัดสตริง? เพิ่งทราบว่าสิ่งนี้จะทำงานได้ไม่ดีมากหากใช้หลายครั้งเช่นในวง อย่าทำสิ่งนี้ตามนิสัย
ErikE

31

คุณสามารถใช้ LINQ str.Take(n)หรือstr.SubString(0, n)ที่หลังจะโยนยกเว้นสำหรับArgumentOutOfRangeExceptionn > str.Length

ทราบว่ารุ่น LINQ ส่งกลับIEnumerable<char>เพื่อให้คุณจะต้องแปลงIEnumerable<char>ไป:stringnew string(s.Take(n).ToArray())


10
อย่าใช้ Linq เพื่อตัดทอนสตริง นั่นไร้สาระ
ErikE

17

เมื่อใดก็ตามที่ฉันต้องทำกิจวัตรสตริงใน C #, ฉันคิดถึงดีเก่าLeftและRightฟังก์ชั่นจาก Visual Basic Substringซึ่งเป็นง่ายมากในการใช้งานมากกว่า

ดังนั้นในโครงการ C # ส่วนใหญ่ของฉันฉันสร้างวิธีการขยายสำหรับพวกเขา:

public static class StringExtensions
{
    public static string Left(this string str, int length)
    {
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - Math.Min(length, str.Length));
    }
}

หมายเหตุ: ส่วนหนึ่งเป็นเพราะมีพ่นเมื่อความยาวสายเข้าที่มีขนาดเล็กกว่าความยาวที่ร้องขอดังกล่าวแล้วในความคิดเห็นบางอย่างภายใต้คำตอบก่อน
Math.MinSubstringArgumentOutOfRangeException

การใช้งาน:

string longString = "Long String";

// returns "Long";
string left1 = longString.Left(4);

// returns "Long String";
string left2 = longString.Left(100);

ฉันชอบสิ่งนี้ แต่ถ้าสตริงสั้นกว่าความยาวที่กำหนดมันจะไม่ต่อท้ายช่องว่าง public static string Left(this string str, int length) { var Result = str.Substring(0, Math.Min(length, str.Length)); return (Result.Length < length) ? Result.PadRight(length) : Result; }
Grandizer

strจะต้องมีการตรวจสอบสำหรับโมฆะ
liviriniu

14

เพียง:

public static String Truncate(String input,int maxLength)
{
   if(input.Length > maxLength)
      return input.Substring(0,maxLength);
   return input;
}

7
public static string TruncateLongString(this string str, int maxLength)
{
    return str.Length <= maxLength ? str : str.Remove(maxLength);
}

1
นอกจากนี้โปรดทราบว่าคุณสามารถสร้างวิธีการขยายได้อย่างปลอดภัยโดยเปลี่ยนเงื่อนไขเป็นstr == null || str.Length <= maxLength
kbrimington

6
สำหรับทุกคนที่สงสัยว่าดีกว่าRemoveหรือไม่Substringก็ไม่มีความแตกต่าง Remove(maxLength)เพียงแค่เรียกใช้Substring(0,maxLength)หลังจากการตรวจสอบขอบเขต สิ่งที่คุณต้องการขึ้นอยู่กับว่าคุณคิดว่าการตัดทอนเป็น "ใช้อักขระ maxLength แรก" หรือ "ทิ้งทุกสิ่งหลังจากอักขระ maxLength" แน่นอนมันเป็นทั้งสองอย่างดังนั้นมันขึ้นอยู่กับคุณ
stevemegson

5

หากเรากำลังพูดถึงการตรวจสอบความถูกต้องด้วยเหตุนี้เราจึงไม่ได้ตรวจสอบรายการสตริงว่าง มีเหตุผลเฉพาะเจาะจงหรือไม่

ฉันคิดว่าความช่วยเหลือทางด้านล่างเนื่องจาก IsNullOrEmpty เป็นวิธีการที่ระบบกำหนดไว้และผู้ประกอบการที่ประกอบไปด้วยไตรภาคซับซ้อน = 1 ในขณะที่ถ้า () {} else {} มีค่า 2

    public static string Truncate(string input, int truncLength)
    {
        return (!String.IsNullOrEmpty(input) && input.Length >= truncLength)
                   ? input.Substring(0, truncLength)
                   : input;
    }

ปัญหาความซับซ้อนของวงจร 2 เป็นอย่างไร
Muflix

1

ฉันเพิ่มสิ่งนี้ลงในโครงการของฉันเพราะฉันใช้มันเป็นโอกาสสูงที่จะใช้เป็นลูปในโครงการที่โฮสต์ทางออนไลน์ดังนั้นฉันจึงไม่ต้องการความผิดพลาดใด ๆ หากฉันสามารถจัดการได้ ความยาวเหมาะกับคอลัมน์ที่ฉันมี มันคือ C # 7

แค่บรรทัดเดียว:

 public static string SubStringN(this string Message, int Len = 499) => !String.IsNullOrEmpty(Message) ? (Message.Length >= Len ? Message.Substring(0, Len) : Message) : "";

0

วิธีการ. NET Substring เต็มไปด้วยอันตราย ฉันพัฒนาวิธีการขยายที่จัดการสถานการณ์ที่หลากหลาย สิ่งที่ดีคือมันรักษาพฤติกรรมดั้งเดิมไว้ แต่เมื่อคุณเพิ่มพารามิเตอร์ "จริง" เพิ่มเติมมันจะเปลี่ยนวิธีการส่วนขยายเพื่อจัดการกับข้อยกเว้นและส่งกลับค่าตรรกะมากที่สุดโดยอิงตามดัชนีและความยาว ตัวอย่างเช่นถ้าความยาวเป็นลบและนับถอยหลัง คุณสามารถดูผลการทดสอบที่มีความหลากหลายของค่าไวโอลินที่: https://dotnetfiddle.net/m1mSH9 สิ่งนี้จะช่วยให้คุณมีความคิดที่ชัดเจนเกี่ยวกับวิธีการแก้ไขสารตั้งต้น

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

    public static String Substring(this String val, int startIndex, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        return val.Substring(startIndex < 0 ? 0 : startIndex > (val.Length - 1) ? val.Length : startIndex);
    }

    public static String Substring(this String val, int startIndex, int length, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex, length);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        int newfrom, newlth, instrlength = val.Length;
        if (length < 0) //length is negative
        {
            newfrom = startIndex + length;
            newlth = -1 * length;
        }
        else //length is positive
        {
            newfrom = startIndex;
            newlth = length;
        }
        if (newfrom + newlth < 0 || newfrom > instrlength - 1)
        {
            return string.Empty;
        }
        if (newfrom < 0)
        {
            newlth = newfrom + newlth;
            newfrom = 0;
        }
        return val.Substring(newfrom, Math.Min(newlth, instrlength - newfrom));
    }

ฉัน blogged เกี่ยวกับเรื่องนี้กลับในเดือนพฤษภาคม 2010 เวลา: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html


0

บางส่วนเพื่อประโยชน์ของการสรุป (ไม่รวมโซลูชัน LINQ) นี่คือหนึ่งในสอง liners ที่อยู่int maxLengthcaveat ของการอนุญาตให้ค่าลบและกรณีของสตริง null:

  1. Substringทาง (จากคำตอบที่พอล Ruane ของ ):
public static string Truncate(this string s, uint maxLength) =>
    s?.Substring(0, Math.Min(s.Length, (int)maxLength));
  1. Removeทาง (จากคำตอบของ kbrimington ):
public static string Truncate(this string s, uint maxLength) =>
    s?.Length > maxLength ? s.Remove((int)maxLength) : s;


-4

string.Substring (0, n); // 0 - เริ่มดัชนีและ n - จำนวนตัวอักษร


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