Bir .NET dizesini nasıl kısaltabilirim?


406

Uzunluğu belirli bir değerden daha uzun olmayacak şekilde bir dizeyi kısaltmak istiyorum. Bir veritabanı tablosuna yazıyorum ve yazdığım değerlerin sütunun veri türünün kısıtlamasını karşıladığından emin olmak istiyorum.

Örneğin, aşağıdakileri yazabilseydim iyi olur:

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

Ne yazık ki, bu bir istisna oluşturur, çünkü maxLengthgenellikle dizenin sınırlarını aşar value. Tabii ki, aşağıdaki gibi bir işlev yazabilirdim, ancak böyle bir şeyin zaten var olduğunu umuyordum.

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

Bu görevi gerçekleştiren zor API nerede? Bir tane var mı?


24
Kayıt için, dizeler değiştirilemez, onları kesemezsiniz, sadece kesilmiş bir kopyasını döndürebilirsiniz. Nitpicky, biliyorum.
John Weldon

2
@John Weldon: Muhtemelen üye fonksiyonu mevcut değil - veri tipinin anlambilimine uymuyor. Bir yan notta, StringBuilderuzunluğu kısaltarak kısalmanızı sağlar, ancak dizeyi genişletmemek için yine de uzunluk kontrolü yapmanız gerekir.
Steve Guidi

1
Hangi çözümü seçerseniz seçin, Substring'i çağırmadan veya Length özelliğine erişmeden önce boş bir dize için bir kontrol eklediğinizden emin olun.
Ray

3
@SteveGuidi - Durum böyleyse, benzer semantik sorunlarla karşılaşan Trim veya Değiştir gibi işlevler olmazdı
Chris Rogers

1
@JohnWeldon Microsoft'un kendisinden sürekli olarak daha nitpicky, olduğu gibi - örneğin, .Trim()dizeyi değiştirdiği gibi yanıltıcı bir şekilde ses çıkaran bir şekilde belgelemekten mutluluk duyuyorlar : "Tüm önde gelen ve arkadaki boşluk karakterlerini geçerli String nesnesi. "
Mark Amery

Yanıtlar:


620

Maalesef ipte bir Truncate()yöntem yok. Bu tür bir mantığı kendiniz yazmalısınız. Ancak yapabileceğiniz şey, bunu bir uzantı yöntemine sarmaktır, böylece her yerde çoğaltmanız gerekmez:

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); 
    }
}

Şimdi yazabiliriz:

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

5
Harika bir çözüm, ancak bunun sadece NET 3.5 ve Up'da çalıştığını hatırladı. NET2.0'da denemeyin.
Jedi Ustası Ürkütücü

7
VS 2008 ve muhtemelen VS 2010'da olduğunuz sürece .Net 2.0'ı hedefleseniz bile bunu yapabilirsiniz. danielmoth.com/Blog/…
Mark

4
maxLengthNegatif bir değer olduğunda bu başarısız olur .
Bernard

42
@ Bernard, maxLength negatifse bunun başarısız olması gerekiyordu. Diğer davranışlar beklenmedik olur.
bojingo

12
Boş değerlerde uzantı yöntemlerini çağırabilirsiniz.
Joel Malone

127

Veya üçlü operatör yerine Math.min'i kullanabilirsiniz.

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
Zeki! Ve aşağıdaki ifade özgün dize bir başvuru döndürmek için optimize edilmiştir: value.Substring(0, value.Length).
Steve Guidi

4
Ne yazık ki, değerin olduğu durumlar için optimize edilmemiştir. Uzunluk, bazı verilerde yaygın olarak karşılaşılabilecek MaxLength değerinden küçüktür. Ayrıca, string üzerindeki Length özelliği de büyük harfle yazılmalıdır.
jpierson

1
maxLengthNegatif bir değer olduğunda bu başarısız olur .
Bernard

7
@ Bernard, çerçevede bir çok şey olacak ... ama eğer kontrol edersem ... ya varsayılan maxLengtholarak 0ya da value.Length; ya da ArgumentOutOfRangeExceptionbu durumda daha mantıklı olan ve zaten Substringher neyse atılan bir ... atmam gerekiyor.
CaffGeek

2
Biraz daha kısa:return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
user1127860

43

Diğerleri tarafından ele alınan tüm davaları kapsadığına inandığım ve bunu hala okunabilir olan özlü bir şekilde yaptığına inandığım için uygulamama atılacağımı düşündüm.

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

    return value;
}

Bu çözüm esas olarak Ray'ın çözümünü temel alır ve bu anahtar kelimeyi LBushkin'in çözümünde yaptığı gibi bu anahtar kelimeyi kullanarak bir genişletme yöntemi olarak kullanmak için açar .


maxLengthNegatif bir değer olduğunda bu başarısız olur .
Bernard

15
@Bernard - Beklenmedik bir değer olduğu için maxLength argümanı için negatif bir değer iletmemenizi öneririm. Substring yöntemi aynı yaklaşımı benimsediğinden, istisnasını iyileştirmek için bir neden yoktur.
jpierson

IsNullOrEmpty kontrolünün gerekli olduğunu düşünmüyorum? (1) Değer null ise, bu uzantı yöntemini çağırmanın bir yolu olmamalıdır. (2) Değer boş dize ise, value.Length> maxLength kontrolü başarısız olur.
Jon Schneider

8
@JonSchneider, bu bir uzantı yöntemi olduğundan IsNullOrEmpty gereklidir. Boş olarak atanmış bir tür dizginiz varsa, derleyici bu yöntemi çağırmadan önce bir boş denetim eklemez. Teknik olarak, bu hala statik sınıfın statik bir yöntemidir. So: stringVar.Truncate (2) Şu şekilde derler: StringExt.Truncate (stringVar, 2);
Jeff B

40

Performans testi eğlenceli olduğu için: ( linqpad genişletme yöntemlerini kullanarak )

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();

truncateYöntemi "önemli ölçüde" hızlıydı. #microoptimization

erken

  • trunkate10 5788 keneler geçti (0,5788 ms) [10K tekrarda, 5,788E-05 ms]
  • smart-trunc10 8206 keneler geçti (0.8206 ms) [10K tekrarda, 8.206E-05 ms]
  • stringbuilder10 10557 keneler geçti (1.0557 ms) [10K tekrarda, 0.00010557 ms başına]
  • concat10 45495 keneler geçti (4.5495 ms) [10K tekrarda, 0.00045495 ms başına]
  • newstring10 72535 keneler geçti (7.2535 ms) [10K tekrarda, 0.00072535 ms başına]

Geç

  • truncate44 8835 keneler geçti (0.8835 ms) [10K tekrarda, 8.835E-05 ms başına]
  • stringbuilder44 13106 keneler geçti (1.3106 ms) [10K tekrarda, 0.00013106 ms başına]
  • smart-trunc44 14821 keneler geçti (1.4821 ms) [10K tekrarda, 0.00014821 ms başına]
  • newstring44 144324 keneler geçti (14.4324 ms) [10K tekrarda, 0.00144324 ms başına]
  • concat44 174610 keneler geçti (17.461 ms) [10K tekrarda, 0.0017461 ms başına]

Çok uzun

  • smart-trunc64 6944 keneler geçti (0.6944 ms) [10K tekrarda, 6.944E-05 ms]
  • truncate64 7686 keneler geçti (0.7686 ms) [10K tekrarda, 7.686E-05 ms başına]
  • stringbuilder64 13314 keneler geçti (1.3314 ms) [10K tekrarda, 0.00013314 ms başına]
  • newstring64 177481 keneler geçti (17.7481 ms) [10K tekrarda, 0.00177481 ms başına]
  • concat64 241601 keneler geçti (24.1601 ms) [10K tekrarda, 0.00241601 ms başına]

Tüm faydalı kriterler için teşekkürler! ... ve Linkpad kayaları!
Sunsetquest


38

.NET 4.0'da şu Takeyöntemi kullanabilirsiniz :

string.Concat(myString.Take(maxLength));

Verimlilik için test edilmemiştir!


27

LINQ kullanabilirsiniz ... dize uzunluğunu kontrol etme ihtiyacını ortadan kaldırır. Kuşkusuz belki de en verimli değil, ama eğlenceli.

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

veya

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

2
bu neden kabul edilen cevap değil? En basit olan, korumak / belgelemek için kendi Uzatma yönteminizi yazmak veya GELİŞTİRMEK gibi bir şey kullanmak .Take
Don Cheadle

9
@mmcrae Linq daha basit olabilir, ama aynı zamanda çok daha yavaştır. Karşılaştırmam Linq için ~ 400ms ve 1 milyon yineleme için Substring için sadece ~ 24ms diyor.
Hein Andre Grønnestad

Bu çözüm hiç kullanılmamalıdır. Yukarıdaki iki yorumda belirtildiği gibi, mevcut dize maksimum uzunluktan daha büyük olmasa bile her zaman bellek ayırma vardır. Ayrıca çok yavaş.
Kamarey

15

Ben böyle bir satırda benimkini yaptım

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

2
1; bu, kabul edilen yanıtta bulunmayan hiçbir şey eklemez.
Mark Amery

2
@markamery, kullanmanız gerektiğinde yazmak ve güncellemek için daha az kod içeren daha kısa bir alternatiftir. Beğenmediniz mi? Kullanmayın
SeanMC

Hızlı, basit ve hızlı. Buna ihtiyacım vardı. Teşekkürler!
Peter

14

Henüz kimse bunu yayınlamadı gibi görünüyor:

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

&& operatörünün kullanılması kabul edilen yanıttan çok az daha iyi olmasını sağlar.


13

.NET Framework, böyle bir dizeyi kısaltmak için bir API'ye sahiptir:

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

Ancak bir C # uygulamasında muhtemelen ana raison d'etre geriye dönük uyumluluk olan Microsoft.VisualBasic.dll'ye bağımlı olmaktan ziyade kendinizinkini yuvarlamayı tercih edersiniz.


".NET Framework'te bir API var" ile çelişiyorsunuz. Bu bir VB.NET API'sı
Camilo Terevinto

9
@CamiloTerevinto - .NET Framework ile birlikte gelen ve yönetilen herhangi bir dilden çağrılabilen bir API'dir.
Joe

1
VB DLL içinde çok iyi şeyler var. Neden bu kadar çok c # geliştirici var?
Michael Z.

Ne yazık ki şu anda .NET Core desteği yok. Aslında, Microsoft.VisualBasic.Strings.NET Core'daki tüm modüller oldukça boş .
Mark Amery

1
Joe yorumuna katılıyorum, yine de diğer dillerden VB için belirli bir şey çağırmayı doğru hissetmiyorum. "VB DLL" çok iyi şeyler varsa, neden bazı paylaşılan bir yere koymak değil? Microsoft'un bu şeylerle yarın ne yapacağını kim bilebilir? Desteği durdurun falan ..
Kamarey


6

Bunun eski bir soru olduğunu biliyorum, ama burada güzel bir çözüm var:

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);

İade: merhaba ...


@SarjanWebDev Bu özel karakter "." in cmd.exe
Neal Ehardt

5

C # 6'nın Null yayılma operatörü ile benzer bir varyant

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

Lütfen dikkat, valueburada iki kez boş olup olmadığını kontrol ediyoruz .


5

C # dizeleri için 2016'da hala Truncate yöntemi yok. Ancak - C # 6.0 Sözdizimini Kullanma:

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); 
  }
}

Mucizevi şekilde çalışır:

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

4

@CaffGeek'i alıp basitleştirelim:

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

4

Kndly, bir dizgeyi kesmenin sadece bir dizeyi yalnızca belirli bir uzunlukta kesmenin yanı sıra kelimeyi bölmemeye dikkat etmek anlamına geldiğini unutmayın.

ör: string: bu bir test dizesidir.

11'de kesmek istiyorum. Yukarıda verilen yöntemlerden herhangi birini kullanırsak sonuç

bu bir te

Bu istediğimiz şey değil

Kullandığım yöntem de mükemmel olmayabilir, ancak durumun çoğunu işleyebilir

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

Neden olmasın:

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

yani olay value.Length < maxLengthpedi sonuna kadar boşluk bırakabilir veya fazlalığı kesebilir.


İki kat daha fazla dize nesnesi üretiyorsunuz ve PadRight çağrısından bir NullReferenceException durumu uygun değilse değer null ise, bu bir ArgumentNullException olmalıdır.
Jeremy

1
@Jeremy "değer null ise PadRight çağrısından bir NullReferenceException oluşturabilir" anlamıyorum; "// string.IsNullOrEmpty (değer) kontrol ve üzerinde hareket."
Sri

3

Burada yeterli cevap yoksa, işte benim :)

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;
}

kullanmak:

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

2

Karmaşıklık uğruna, son 3 karakteri maxLength parametresine göre üç nokta ile değiştiren aşırı yüklenmiş sürümümü ekleyeceğim.

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

Örnek uzunluğum 30 olan iki sentim:

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

1

Ben jpierson'ın cevabını tercih ederim, ancak burada görebildiğim örneklerin hiçbiri, maxLength <0 gibi geçersiz bir maxLength parametresini işliyor.

Seçimler ya bir try / catch'da hatayı işlemek, maxLength parametresini min 0 olarak sabitlemek veya maxLength 0'dan küçükse boş bir dize döndürmek olacaktır.

Optimize edilmemiş kod:

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
Benim uygulamada, ben yapacağım tek şey aslında string.Substring () benim için ne yapar bir ArgumentOutOfRangeExcpetion atmak olduğunu düşündüm çünkü maximumLength 0'dan küçük olduğu durumda işlememeyi seçti.
jpierson

1

İşte bir vb.net çözümü, dize zaten maxlength'den daha küçük olduğunda subring deyimine ihtiyacımız olmadığından if (çirkin olmasına rağmen) ifadesinin performansı geliştirdiğini işaretleyin ... Dize için bir uzantı yaparak kullanımı kolaydır. ..

 <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 içinde "Not String.IsNullOrEmpty (String__1)" yerine "String__1 <> Hiçbir şey" değiştirebilirsiniz. Biraz daha kısa. Dizeler için varsayılan değer boş bir dizedir. "<> Hiçbir Şey" kullanıldığında, hem boş hem de boş dize durumları kontrol edilir.
Şunlarla

VB'de Left (dize, maxlength) yapabilirsiniz
Michael Z.

1

Zaten bir ton cevap olduğunu biliyorum ama ihtiyacım dize başlangıcını ve sonunu sağlam tutmak ama maksimum uzunluğun altına kısaltmaktı.

    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));
    }

Bu, en fazla 260 karakter uzunluğunda SharePoint URL'leri oluşturmak içindir.

260 sabit olduğu için uzunluk parametresi yapmadım. Ayrıca ilk alt dize uzunluğunu bir parametre yapmadım çünkü belirli bir noktada kırılmasını istiyorum. Son olarak, ikinci alt dize kaynak uzunluğudur - 20 Ben klasör yapısını biliyorum.

Bu, özel ihtiyaçlarınıza kolayca uyarlanabilir.


1

Zaten burada bir ton cevap olduğunu biliyorum, ama bu hem boş dizeleri hem de geçen sürenin negatif olduğu durumu ele alan, gittiğim soru:

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);
}

1

C # 8'de yeni Aralıklar özelliği kullanılabilir ...

value = value[..Math.Min(30, value.Length)];

0

.Net içinde bildiğim bir şey yok - işte "..." ekleyen sürümüm:

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
Sürümünüz, kesilmeleri durumunda, istenen uzunluktan 3 karakter uzunluğunda dizeler verecektir. Ayrıca, üçlü noktalar temsil açısından gerçekten anlamlı, OP'nin verdiği kullanım durumu gibi bir veritabanında saklamam.
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
Herkese açık yöntem adınızın önüne bir alt çizgi koyuyorsunuz?
Michael Z.

0

Yukarıda tartışılan olanaklara ek olarak, çözümümü paylaşmak istiyorum. Null (string.Empty döndürür) sağlayan bir uzatma yöntemidir ve ayrıca bir elips ile kullanmak için ikinci bir .Truncate () yöntemi vardır. Dikkat, performans optimize değil.

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
    }

Buradaki ToArray()çağrı sadece gereksiz yükü; örneğin kullanarak String.Concat, bir dizi üzerinden gitmek zorunda kalmadan bir dizi karakterden bir dize oluşturabilirsiniz.
Mark Amery

-3

Dizeyi Kes

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 "";
        }            
    }

Bu OP'nin sorusuna cevap vermiyor. İlk olarak, bir üye işlevi olmalıdır (bir uzantı yöntemi olarak yazmış olsanız da). İkincisi, OP metnin bölünmesi ve kelimelerin yakl. Kelime başına 7.6 karakter.
Wicher Visser

7.6 sadece bir sayıdır. istediğiniz başka bir sayı yazabilirsiniz. Bu ortalama bir İngilizce kelime uzunluğu oldu. Bunu Google'da buldum. Bölme kullanmak, kelimeleri boşluklara göre ayırmanın kolay bir yoludur. Yarım kelime göstermek istediğini sanmıyorum! Bu nedenle, daha fazla kod gerektirecek boş alan bulmak için döngü yapmazsanız, bu bir dizeyi kısaltmanın ve tam kelimeleri görüntülemenin kolay bir yoludur. Bu, bir dizenin belirtilen uzunluktan daha uzun olmamasını ve sözcükleri kırmayacağınızı garanti eder.
VT

-4

Bu genellikle kullandığım kod:

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
Dizeleri + = ile birleştirmenin, özellikle karakter karakter yeniden oluştururken pahalı bir işlem olduğunu lütfen unutmayın. .NET dizeleri değiştirilemez, yani bu durumda döngünüzde her seferinde yeni bir dize oluşturulur.
Steve Guidi

@SteveGuidi dizeleri değişmez değildir, sadece değişmez olarak maskelenirler. Dize dize ve dize olabilir bu yüzden gerçek değişmez ilkel olduğunu isterdim, ama ne yazık ki onlar ilkel değildir.
Chris Marisic

Performans maliyeti önemliyse pahalı diyorsunuz, stringBuilder kullanmak için değiştirdim ama + = ile neler olduğunu görmek daha kolay olduğunu düşünüyorum, sadece OP kolayca kodu anlamak istedi.
user3390116
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.