ฉันจะตัดทอนสตริง. NET ได้อย่างไร


406

ฉันต้องการจะตัดทอนสตริงที่มีความยาวไม่เกินค่าที่กำหนด ฉันกำลังเขียนลงในตารางฐานข้อมูลและต้องการให้แน่ใจว่าค่าที่ฉันเขียนตรงตามข้อ จำกัด ของประเภทข้อมูลของคอลัมน์

เช่นจะดีถ้าฉันสามารถเขียนต่อไปนี้:

string NormalizeLength(string value, int maxLength)
{
    return value.Substring(0, maxLength);
}

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

string NormalizeLength(string value, int maxLength)
{
    return value.Length <= maxLength ? value : value.Substring(0, maxLength);
} 

API ที่เข้าใจยากอยู่ที่ไหนซึ่งทำงานนี้ มีไหม


24
สำหรับเร็กคอร์ดสตริงไม่เปลี่ยนรูปคุณไม่สามารถตัดทอนได้คุณสามารถส่งคืนสำเนาที่ถูกตัดทอนได้เท่านั้น Nitpicky ฉันรู้
John Weldon

2
@John Weldon: นั่นอาจเป็นเหตุผลว่าทำไมฟังก์ชั่นสมาชิกไม่ได้อยู่ - มันไม่เป็นไปตามความหมายของประเภทข้อมูล ในบันทึกย่อด้านข้างStringBuilderให้คุณตัดปลายด้วยการตัดความยาว แต่คุณยังต้องทำการตรวจสอบความยาวเพื่อหลีกเลี่ยงการขยายสตริง
Steve Guidi

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

3
@SteveGuidi - หากพบว่าเป็นกรณีนี้แล้วจะไม่มีการทำงานเช่นการตัดแต่งหรือแทนที่ซึ่งประสบปัญหาความหมายคล้ายกัน
คริสโรเจอร์ส

1
@JohnWeldon nitpicky มากกว่าตัวเองอย่างต่อเนื่องเป็นอย่างที่มันเกิดขึ้น - พวกเขามีความสุขที่จะจัดทำเอกสารเช่น.Trim()ในลักษณะที่ทำให้เข้าใจผิดดูเหมือนว่ามันกลายพันธุ์สตริง: "ลบอักขระช่องว่างนำหน้าและต่อท้ายทั้งหมดออกจาก วัตถุสตริงปัจจุบัน "
Mark Amery

คำตอบ:


620

ไม่มีTruncate()วิธีการในสายโชคไม่ดี คุณต้องเขียนตรรกะแบบนี้ด้วยตัวคุณเอง อย่างไรก็ตามสิ่งที่คุณสามารถทำได้คือห่อไว้ในวิธีการขยายดังนั้นคุณไม่จำเป็นต้องทำซ้ำทุกที่:

public static class StringExt
{
    public static string Truncate(this string value, int maxLength)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return value.Length <= maxLength ? value : value.Substring(0, maxLength); 
    }
}

ตอนนี้เราสามารถเขียน:

var someString = "...";
someString = someString.Truncate(2);

5
โซลูชั่นที่ยอดเยี่ยม แต่จำได้ว่าทำงานได้เฉพาะใน NET 3.5 ขึ้นไป อย่าลองใน NET2.0
อาจารย์เจได Spooky

7
ตราบใดที่คุณอยู่ใน VS 2008 และน่าจะเป็น VS 2010 คุณยังสามารถทำได้แม้ว่าจะกำหนดเป้าหมาย. Net 2.0 danielmoth.com/Blog/…
ทำเครื่องหมาย

4
สิ่งนี้จะล้มเหลวเมื่อmaxLengthเป็นค่าลบ
เบอร์นาร์ด

42
@ เบอร์นาร์ดนี่ควรจะล้มเหลวถ้า maxLength เป็นลบ พฤติกรรมอื่น ๆ จะไม่คาดคิด
bojingo

12
คุณสามารถเรียกใช้เมธอดส่วนขยายด้วยค่า Null
Joel Malone

127

หรือแทนผู้ประกอบการที่ประกอบไปด้วยคุณสามารถใช้ Math.min

public static class StringExt
{
    public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return value.Substring(0, Math.Min(value.Length, maxLength));
    }
}

10
ฉลาด! value.Substring(0, value.Length)และนิพจน์ต่อไปนี้เหมาะที่จะกลับมามีการอ้างอิงถึงสตริงเดิม:
Steve Guidi

4
น่าเสียดายที่มันไม่ได้ปรับให้เหมาะสมสำหรับกรณีที่มีค่าความยาวน้อยกว่า MaxLength ซึ่งอาจเป็นกรณีทั่วไปในข้อมูลบางอย่าง นอกจากนี้ความยาวคุณสมบัติบนสตริงควรเป็นตัวพิมพ์ใหญ่
jpierson

1
สิ่งนี้จะล้มเหลวเมื่อmaxLengthเป็นค่าลบ
เบอร์นาร์ด

7
@Bernard ดังนั้นจะจำนวนมากของสิ่งที่อยู่ในกรอบ ... แต่ถ้าฉันจะตรวจสอบให้มัน ... ฉันอาจจะต้องเริ่มต้นmaxLengthที่จะ0หรือvalue.Length; หรือฉันต้องโยนArgumentOutOfRangeException... ซึ่งเหมาะสมกว่าในกรณีนี้และถูกโยนทิ้งไปแล้วด้วยวิธีSubstringใดก็ตาม
CaffGeek

2
สั้นกว่าเล็กน้อย:return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
user1127860

43

ฉันคิดว่าฉันจะโยนในการนำไปใช้เนื่องจากฉันเชื่อว่าครอบคลุมทุกกรณีที่ผู้อื่นได้รับการสัมผัสและทำอย่างรัดกุมที่ยังอ่านได้

public static string Truncate(this string value, int maxLength)
{
    if (!string.IsNullOrEmpty(value) && value.Length > maxLength)
    {
        return value.Substring(0, maxLength);
    }

    return value;
}

วิธีการแก้ปัญหานี้สร้างขึ้นบนโซลูชันของ Rayและเปิดวิธีการใช้เป็นวิธีการขยายโดยใช้คำหลักนี้เช่นเดียวกับLBushkinในโซลูชันของเขา


สิ่งนี้จะล้มเหลวเมื่อmaxLengthเป็นค่าลบ
เบอร์นาร์ด

15
@Bernard - ฉันไม่แนะนำให้ส่งค่าลบสำหรับอาร์กิวเมนต์ maxLength เนื่องจากเป็นค่าที่ไม่คาดคิด กระบวนการ Substring ใช้วิธีการเดียวกันดังนั้นจึงไม่มีเหตุผลที่จะปรับปรุงข้อยกเว้นที่เกิดขึ้น
jpierson

ฉันไม่คิดว่าการตรวจสอบ IsNullOrEmpty จำเป็นหรือไม่ (1) ถ้าค่าเป็นโมฆะไม่ควรเรียกวิธีส่วนขยายนี้ได้ (2) ถ้า value เป็นสตริงว่างการตรวจสอบ value.Length> maxLength จะล้มเหลว
Jon Schneider

8
@JonSchneider จำเป็นต้องใช้ IsNullOrEmpty เนื่องจากนี่เป็นวิธีส่วนขยาย หากคุณมีตัวแปรประเภทสตริงที่ได้รับการกำหนดเป็นโมฆะคอมไพเลอร์ไม่ได้แทรกการตรวจสอบเป็นโมฆะก่อนที่จะเรียกวิธีนี้ ในทางเทคนิคนี้ยังคงเป็นวิธีการคงที่ของระดับคงที่ ดังนั้น: stringVar.Truncate (2) คอมไพล์เป็น: StringExt.Truncate (stringVar, 2);
Jeff B

40

เนื่องจากการทดสอบประสิทธิภาพเป็นเรื่องสนุก: (ใช้วิธีการขยาย linqpad )

var val = string.Concat(Enumerable.Range(0, 50).Select(i => i % 10));

foreach(var limit in new[] { 10, 25, 44, 64 })
    new Perf<string> {
        { "newstring" + limit, n => new string(val.Take(limit).ToArray()) },
        { "concat" + limit, n => string.Concat(val.Take(limit)) },
        { "truncate" + limit, n => val.Substring(0, Math.Min(val.Length, limit)) },
        { "smart-trunc" + limit, n => val.Length <= limit ? val : val.Substring(0, limit) },
        { "stringbuilder" + limit, n => new StringBuilder(val, 0, Math.Min(val.Length, limit), limit).ToString() },
    }.Vs();

truncateวิธีการก็คือ "อย่างมีนัยสำคัญ" ได้เร็วขึ้น #microoptimization

ตอนต้น

  • truncate10 5788 ticks ที่ผ่านไป (0.5788 ms) [ใน 10K reps, 5.788E-05 ms ต่อ]
  • smart-trunc10 8206 ticks ที่ผ่านไป (0.8206 ms) [ใน 10K reps, 8.206E-05 ms ต่อ]
  • stringbuilder10 1,0557 ticks elapsed (1.0557 ms) [ใน 10K reps, 0.00010557 ms ต่อ]
  • concat10 45495 ticks ที่ผ่านไป (4.5495 ms) [ใน 10K reps, 0.00045495 ms ต่อ]
  • newstring10 72535 ticks ที่ผ่านไป (7.2535 ms) [ใน 10K reps, 0.00072535 ms ต่อ]

สาย

  • truncate44 8835 ticks ที่ผ่านไป (0.8835 ms) [ใน 10K reps, 8.835E-05 ms ต่อ]
  • stringbuilder44 13106 ticks ที่ผ่านไป (1.3106 ms) [ใน 10K reps, 0.00013106 ms ต่อ]
  • smart-trunc44 14821 ticks elapsed (1.4821 ms) [ใน 10K reps, 0.00014821 ms ต่อ]
  • newstring44 144324 ticks ที่ผ่านไป (14.4324 ms) [ใน 10K reps, 0.00144324 ms ต่อ]
  • concat44 174610 ticks ที่ผ่านไป (17.461 ms) [ใน 10K reps, 0.0017461 ms ต่อ]

นานเกินไป

  • smart-trunc64 6944 ticks ที่ผ่านไป (0.6944 ms) [ใน 10K reps, 6.944E-05 ms ต่อ]
  • truncate64 7686 ticks ที่ผ่านไป (0.7686 ms) [ใน 10K reps, 7.686E-05 ms ต่อ]
  • stringbuilder64 13314 ticks ที่ผ่านไป (1.3314 ms) [ใน 10K reps, 0.00013314 ms ต่อ]
  • newstring64 177481 ticks ที่ผ่านไป (17.7481 ms) [ใน 10K reps, 0.00177481 ms ต่อ]
  • concat64 241601 ticks ที่ผ่านไป (24.1601 ms) [ใน 10K reps, 0.00241601 ms ต่อ]

ขอบคุณสำหรับการวัดประสิทธิภาพที่มีประโยชน์ทั้งหมด! ... และหิน Linkpad!
Sunsetquest

ไม่เคยคิดเลยว่า linqpad สามารถทำสิ่งเหล่านั้นได้
jefissu


27

คุณสามารถใช้ LINQ ... มันไม่จำเป็นต้องตรวจสอบความยาวสตริง อาจยอมรับได้ว่ามีประสิทธิภาพที่สุด แต่ก็สนุกดี

string result = string.Join("", value.Take(maxLength)); // .NET 4 Join

หรือ

string result = new string(value.Take(maxLength).ToArray());

2
ทำไมนี่ไม่ใช่คำตอบที่ยอมรับ? สิ่งที่ตรงไปตรงมามากที่สุดเขียนวิธีการขยายของคุณเองที่คุณต้องการที่จะรักษา / เอกสารหรือใช้สิ่งที่สร้างขึ้นในรูปแบบใช้
ดอน Cheadle

9
@mmcrae Linq อาจตรงไปตรงมามากกว่า แต่ก็ช้ากว่ามากเช่นกัน มาตรฐานของฉันบอกว่า ~ 400ms สำหรับ Linq และเพียง 24ms สำหรับ Substring สำหรับการทำซ้ำ 1 ล้านครั้ง
Hein Andre Grønnestad

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

15

ฉันทำของฉันแบบหนึ่งบรรทัด

value = value.Length > 1000 ? value.Substring(0, 1000) : value;

2
-1; นี่ไม่ได้เพิ่มอะไรเลยที่ยังไม่ได้ตอบคำถาม
Mark Amery

2
@ เครื่องหมายเป็นอีกตัวเลือกหนึ่งที่สั้นกว่าและมีรหัสน้อยกว่าในการเขียนและอัปเดตเมื่อคุณต้องการใช้ ไม่ชอบเหรอ อย่าใช้มัน
SeanMC

รวดเร็วง่ายและรวดเร็ว นี่คือสิ่งที่ฉันต้องการ ขอบคุณ!
ปีเตอร์

14

ดูเหมือนว่ายังไม่มีใครโพสต์สิ่งนี้:

public static class StringExt
{
    public static string Truncate(this string s, int maxLength)
    {
        return s != null && s.Length > maxLength ? s.Substring(0, maxLength) : s;
    }
}

การใช้ตัวดำเนินการ && ทำให้ดีกว่าคำตอบที่ยอมรับได้เล็กน้อย


13

.NET Framework มี API เพื่อตัดทอนสตริงดังนี้:

Microsoft.VisualBasic.Strings.Left(string, int);

แต่ในแอป C # คุณอาจจะชอบม้วนตัวเองมากกว่าการพึ่งพา Microsoft.VisualBasic.dll ซึ่ง raison d'etre หลักคือความเข้ากันได้แบบย้อนหลัง


". NET Framework มี API" คุณขัดแย้งกับตัวเอง นั่นคือ VB.NET API
Camilo Terevinto

9
@CamiloTerevinto - เป็น API ที่มาพร้อมกับ. NET Framework และสามารถเรียกใช้จากภาษาที่มีการจัดการใด ๆ
Joe

1
VB DLL มีหลายสิ่งที่ดีอยู่ในนั้น ทำไม c # devs ต่อจำนวนมาก
Michael Z.

ปัจจุบันนี้ไม่มี. NET Core รองรับขออภัย อันที่จริงทั้งMicrosoft.VisualBasic.Stringsโมดูลใน .NET หลักเป็นที่ว่างเปล่าสวย
Mark Amery

1
ในขณะที่ฉันเห็นด้วยกับความคิดเห็นของโจฉันยังรู้สึกไม่ถูกต้องที่จะเรียกสิ่งที่เฉพาะเจาะจงสำหรับ VB จากภาษาอื่น หากมีสิ่งดีๆมากมายใน "VB DLL" ทำไมไม่ลองใส่ในที่อื่นบ้างล่ะ? ใครจะรู้ว่า Microsoft จะทำอะไรกับสิ่งเหล่านี้ในวันพรุ่งนี้ หยุดการสนับสนุนหรือบางสิ่งบางอย่าง ..
Kamarey


6

ฉันรู้ว่านี่เป็นคำถามเก่า แต่นี่เป็นทางออกที่ดี:

public static string Truncate(this string text, int maxLength, string suffix = "...")
{
    string str = text;
    if (maxLength > 0)
    {
        int length = maxLength - suffix.Length;
        if (length <= 0)
        {
            return str;
        }
        if ((text != null) && (text.Length > maxLength))
        {
            return (text.Substring(0, length).TrimEnd(new char[0]) + suffix);
        }
    }
    return str;
}

var myString = "hello world"
var myTruncatedString = myString.Truncate(4);

คืนค่า: สวัสดี ...


@SarjanWebDev อักขระพิเศษนั้นแสดงเป็น "." ใน cmd.exe
Neal Ehardt

5

ตัวแปรที่คล้ายกันกับโอเปอเรเตอร์การกระจาย Null ของ C # 6

public static string Truncate(this string value, int maxLength)
{
    return value?.Length <= maxLength ? value : value?.Substring(0, maxLength);
}

โปรดทราบว่าเราจะตรวจสอบว่าvalueเป็นโมฆะสองครั้งที่นี่หรือไม่


5

ยังไม่มีวิธี Truncate ในปี 2016 สำหรับสตริง C # แต่ - ใช้ไวยากรณ์ C # 6.0:

public static class StringExtension
{
  public static string Truncate(this string s, int max) 
  { 
    return s?.Length > max ? s.Substring(0, max) : s ?? throw new ArgumentNullException(s); 
  }
}

มันใช้งานได้อย่างมีเสน่ห์:

"Truncate me".Truncate(8);
Result: "Truncate"


4

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

เช่นสตริง: นี่คือสตริงทดสอบ

ฉันต้องการตัดมันตอนอายุ 11 หากเราใช้วิธีการใด ๆ ที่ระบุข้างต้นผลลัพธ์จะเป็น

นี่คือเต้

นี่ไม่ใช่สิ่งที่เราต้องการ

วิธีที่ฉันใช้อาจไม่สมบูรณ์แบบ แต่ก็สามารถรับมือกับสถานการณ์ส่วนใหญ่ได้

public string CutString(string source, int length)
{
        if (source== null || source.Length < length)
        {
            return source;
        }
        int nextSpace = source.LastIndexOf(" ", length);
        return string.Format("{0}...", input.Substring(0, (nextSpace > 0) ? nextSpace : length).Trim());
} 

4

ทำไมจะไม่ล่ะ:

string NormalizeLength(string value, int maxLength)
{
    //check String.IsNullOrEmpty(value) and act on it. 
    return value.PadRight(maxLength).Substring(0, maxLength);
}

เช่นในvalue.Length < maxLengthช่องว่างแผ่นกิจกรรมไปยังจุดสิ้นสุดหรือตัดส่วนเกิน


คุณสร้างวัตถุสตริงจำนวนมากเป็นสองเท่าและสามารถส่ง NullReferenceException จากการเรียก PadRight ถ้าค่าเป็น null ซึ่งไม่เหมาะสมควรเป็น ArgumentNullException
Jeremy

1
@ Jeremy ฉันไม่เข้าใจ "มันสามารถโยน NullReferenceException จากการเรียก PadRight ถ้าค่าเป็นโมฆะ"; ฉันไม่ได้พูดถึง "// check string.IsNullOrEmpty (value) และดำเนินการกับมัน"
ศรี

3

ในกรณีที่มีคำตอบไม่เพียงพอที่นี่นี่เป็นของฉัน :)

public static string Truncate(this string str, 
                              int totalLength, 
                              string truncationIndicator = "")
{
    if (string.IsNullOrEmpty(str) || str.Length < totalLength) 
        return str;

    return str.Substring(0, totalLength - truncationIndicator.Length) 
           + truncationIndicator;
}

ใช้:

"I use it like this".Truncate(5,"~")

2

เพื่อความซับซ้อน (เกิน) ฉันจะเพิ่มเวอร์ชันที่มีการโอเวอร์โหลดของฉันซึ่งจะแทนที่อักขระ 3 ตัวสุดท้ายด้วยจุดไข่ปลาเทียบกับพารามิเตอร์ maxLength

public static string Truncate(this string value, int maxLength, bool replaceTruncatedCharWithEllipsis = false)
{
    if (replaceTruncatedCharWithEllipsis && maxLength <= 3)
        throw new ArgumentOutOfRangeException("maxLength",
            "maxLength should be greater than three when replacing with an ellipsis.");

    if (String.IsNullOrWhiteSpace(value)) 
        return String.Empty;

    if (replaceTruncatedCharWithEllipsis &&
        value.Length > maxLength)
    {
        return value.Substring(0, maxLength - 3) + "...";
    }

    return value.Substring(0, Math.Min(value.Length, maxLength)); 
}

2

สองเซ็นต์ของฉันที่มีความยาวตัวอย่าง 30:

  var truncatedInput = string.IsNullOrEmpty(input) ? 
      string.Empty : 
      input.Substring(0, Math.Min(input.Length, 30));

1

ฉันชอบคำตอบของ jpierson แต่ไม่มีตัวอย่างใดที่ฉันเห็นว่ากำลังจัดการพารามิเตอร์ maxLength ที่ไม่ถูกต้องเช่นเมื่อ maxLength <0

ตัวเลือกจะจัดการข้อผิดพลาดในลอง / จับยึดพารามิเตอร์ maxLength ขั้นต่ำเป็น 0 หรือถ้า maxLength น้อยกว่า 0 ส่งคืนสตริงว่าง

ไม่ใช่รหัสที่เหมาะสมที่สุด:

public string Truncate(this string value, int maximumLength)
{
    if (string.IsNullOrEmpty(value) == true) { return value; }
    if (maximumLen < 0) { return String.Empty; }
    if (value.Length > maximumLength) { return value.Substring(0, maximumLength); }
    return value;
}

3
โปรดทราบว่าในการดำเนินการของฉันฉันเลือกที่จะไม่จัดการกับกรณีที่ maximumLength น้อยกว่า 0 เพราะฉันคิดว่าสิ่งเดียวที่ฉันจะทำคือการโยน ArgumentOutOfRangeExcpetion ซึ่งเป็นสิ่งที่ string.Substring () สำหรับฉัน
jpierson

1

นี่คือโซลูชัน vb.net ทำเครื่องหมายว่าคำสั่ง if (แม้ว่าน่าเกลียด) ปรับปรุงประสิทธิภาพเนื่องจากเราไม่ต้องการคำสั่ง substring เมื่อสตริงมีขนาดเล็กกว่า maxlength อยู่แล้ว ... ด้วยการทำให้เป็นส่วนขยายของสตริงนั้นใช้งานง่าย ..

 <System.Runtime.CompilerServices.Extension()> _
    Public Function Truncate(String__1 As String, maxlength As Integer) As String
        If Not String.IsNullOrEmpty(String__1) AndAlso String__1.Length > maxlength Then
            Return String__1.Substring(0, maxlength)
        Else
            Return String__1
        End If
    End Function

ใน VB.net คุณสามารถแทนที่ "Not String ได้ IsNullOrEmpty (String__1)" ด้วย "String__1 <> Nothing" มันสั้นกว่าเล็กน้อย ค่าเริ่มต้นสำหรับสตริงเป็นสตริงว่าง ใช้ "<> ไม่มีอะไร" ตรวจสอบทั้งโมฆะและกรณีสตริงที่ว่างเปล่า ทดสอบกับ: ตัดทอน ("", 50) และตัดทอน (ไม่มีอะไร, 50)
jrjensen

ใน VB คุณสามารถทำ Left (string, maxlength)
Michael Z.

1

ฉันรู้ว่ามีคำตอบมากมายอยู่แล้ว แต่ความต้องการของฉันคือการรักษาจุดเริ่มต้นและจุดสิ้นสุดของสตริงไว้เหมือนเดิม แต่ย่อให้สั้นลงภายใต้ความยาวสูงสุด

    public static string TruncateMiddle(string source)
    {
        if (String.IsNullOrWhiteSpace(source) || source.Length < 260) 
            return source;

        return string.Format("{0}...{1}", 
            source.Substring(0, 235),
            source.Substring(source.Length - 20));
    }

สิ่งนี้ใช้สำหรับสร้าง URL ของ SharePoint ที่มีความยาวสูงสุด 260 ตัวอักษร

ฉันไม่ได้ทำให้ความยาวของพารามิเตอร์เนื่องจากมันเป็นค่าคงที่ 260 ฉันยังไม่ได้ทำให้ความยาวของสตริงย่อยแรกเป็นพารามิเตอร์เพราะฉันต้องการให้มันแตกที่จุดเฉพาะ ในที่สุดซับสตริงที่สองคือความยาวของซอร์ส - 20 ตั้งแต่ฉันรู้จักโครงสร้างโฟลเดอร์

สามารถปรับให้เข้ากับความต้องการเฉพาะของคุณได้อย่างง่ายดาย


1

ฉันรู้ว่ามีคำตอบมากมายอยู่ที่นี่แล้ว แต่นี่คือคำตอบที่ฉันได้ไปซึ่งจัดการกับทั้งสตริงว่างและสถานการณ์ที่ความยาวผ่านเป็นลบ:

public static string Truncate(this string s, int length)
{
    return string.IsNullOrEmpty(s) || s.Length <= length ? s 
        : length <= 0 ? string.Empty 
        : s.Substring(0, length);
}


0

ไม่มีสิ่งใดใน. net สำหรับสิ่งนี้ที่ฉันรู้ - นี่คือเวอร์ชันของฉันที่เพิ่ม "... ":

public static string truncateString(string originalString, int length) {
  if (string.IsNullOrEmpty(originalString)) {
   return originalString;
  }
  if (originalString.Length > length) {
   return originalString.Substring(0, length) + "...";
  }
  else {
   return originalString;
  }
}

2
เวอร์ชันของคุณจะให้สตริงที่ยาวเกิน 3 ตัวอักษรในกรณีที่มีการตัดทอน นอกจากนี้จุดสามจุดนั้นมีความหมายในการเป็นตัวแทนจริง ๆ ฉันจะไม่เก็บมันไว้ในฐานข้อมูลแบบที่เป็นกรณีการใช้งานที่ OP ให้
MarioDS

0

TruncateString

public static string _TruncateString(string input, int charaterlimit)
{
    int characterLimit = charaterlimit;
    string output = input;

    // Check if the string is longer than the allowed amount
    // otherwise do nothing
    if (output.Length > characterLimit && characterLimit > 0)
    {
        // cut the string down to the maximum number of characters
        output = output.Substring(0, characterLimit);
        // Check if the character right after the truncate point was a space
        // if not, we are in the middle of a word and need to remove the rest of it
        if (input.Substring(output.Length, 1) != " ")
        {
            int LastSpace = output.LastIndexOf(" ");

            // if we found a space then, cut back to that space
            if (LastSpace != -1)
            {
                output = output.Substring(0, LastSpace);
            }
        }
        // Finally, add the "..."
        output += "...";
    }
    return output;
}

2
ทำไมคุณถึงนำหน้าชื่อวิธีสาธารณะด้วยเครื่องหมายขีดล่าง?
Michael Z.

0

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

public static string Truncate(this string value, int maxLength) =>
    (value ?? string.Empty).Substring(0, (value?.Length ?? 0) <= (maxLength < 0 ? 0 : maxLength) ? (value?.Length ?? 0) : (maxLength < 0 ? 0 : maxLength));
public static string Truncate(this string value, int maxLength, string ellipsis) =>
    string.Concat(value.Truncate(maxLength - (((value?.Length ?? 0) > maxLength ? ellipsis : null)?.Length ?? 0)), ((value?.Length ?? 0) > maxLength ? ellipsis : null)).Truncate(maxLength);

-1
public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return new string(value.Take(maxLength).ToArray());// use LINQ and be happy
    }

การToArray()โทรที่นี่เป็นค่าใช้จ่ายที่ไม่จำเป็น ใช้เช่นString.Concatคุณสามารถสร้างสตริงจากตัวอักษรนับไม่ต้องไปผ่านอาร์เรย์
Mark Amery

-3

ตัดสตริง

public static string TruncateText(string strText, int intLength)
{
    if (!(string.IsNullOrEmpty(strText)))
    {                                
        // split the text.
        var words = strText.Split(' ');

        // calculate the number of words
        // based on the provided characters length 
        // use an average of 7.6 chars per word.
        int wordLength = Convert.ToInt32(Math.Ceiling(intLength / 7.6));

        // if the text is shorter than the length,
        // display the text without changing it.
        if (words.Length <= wordLength)
            return strText.Trim();                

        // put together a shorter text
        // based on the number of words
        return string.Join(" ", words.Take(wordLength)) + " ...".Trim();
    }
        else
        {
            return "";
        }            
    }

นี่ไม่ได้ตอบคำถามของ OP อันดับแรกควรเป็นฟังก์ชันสมาชิก (แม้ว่าคุณจะเขียนเป็นวิธีการขยาย) ประการที่สอง OP ไม่ได้ระบุว่าข้อความจะต้องถูกแยกและคำจะถูกตัดให้เหลือประมาณ 7.6 ตัวอักษรต่อคำ
Wicher Visser

7.6 เป็นเพียงตัวเลข คุณสามารถเขียนหมายเลขอื่น ๆ ที่คุณต้องการ นี่เป็นความยาวคำภาษาอังกฤษโดยเฉลี่ย ฉันพบมันบน google การใช้ split เป็นวิธีง่ายๆในการแยกคำศัพท์ตามช่องว่าง ฉันไม่คิดว่าคุณต้องการที่จะแสดงครึ่งคำ! ดังนั้นหากคุณวนซ้ำเพื่อค้นหาพื้นที่ว่างซึ่งจะต้องใช้รหัสเพิ่มเติมนี่เป็นวิธีที่ง่ายในการตัดทอนสตริงและแสดงคำเต็ม สิ่งนี้จะช่วยให้คุณมั่นใจได้ว่าสตริงนั้นไม่ได้มีความยาวตามที่กำหนดอีกต่อไปและคุณจะไม่มีคำขาด
VT

-4

นี่คือรหัสที่ฉันมักจะใช้:

string getSubString(string value, int index, int length)
        {
            if (string.IsNullOrEmpty(value) || value.Length <= length)
            {
                return value;
            }
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = index; i < length; i++)
            {
                sb.AppendLine(value[i].ToString());
            }
            return sb.ToString();
        }

5
โปรดทราบว่าการต่อสตริงที่มี + = เป็นการดำเนินการที่มีค่าใช้จ่ายสูงโดยเฉพาะอย่างยิ่งเมื่อสร้างอักขระใหม่ตามตัวอักษร สตริง. NET นั้นไม่เปลี่ยนรูปซึ่งหมายความว่าในกรณีนี้สตริงใหม่จะถูกสร้างขึ้นในแต่ละครั้งในวงของคุณ
Steve Guidi

@SteveGuidi สตริงจะไม่เปลี่ยนรูปพวกเขาเพียงแค่สวมหน้ากากเป็นไม่เปลี่ยนรูป ฉันหวังว่าสตริงนั้นเป็นสิ่งดั้งเดิมที่ไม่เปลี่ยนรูปแบบจริงดังนั้นฉันจึงสามารถมีสตริงและสตริงได้ แต่แต่ทว่ามันก็ไม่ใช่แบบดั้งเดิม
Chris Marisic

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