Substring, mevcut bir string'in bir kısmından oluşan yeni bir string döndürür. İki overload'u vardır:
s.Substring(startIndex):startIndex'ten sona kadar.s.Substring(startIndex, length):startIndex'ten başlayaraklengthkadar karakter.
İndeksler 0'dan başlar ve ikinci argüman bir bitiş konumu değil uzunluktur. JavaScript'in substring(start, end) ve Java'nın substring(begin, end) metotlarından farkı budur ve kod taşınırken yapılan birçok kaydırma hatasının kaynağıdır.
Çıktı:
4271-BLK
SHOE
4271
BLK
0
SHOE-4271-BLK
Her string metodu gibi Substring de orijinali değiştirmez; yeni bir string döndürür, bu yüzden sonucu atayın.
ArgumentOutOfRangeException ve ondan kaçınmak
İstenen aralık string'in içine sığmadığında Substring ArgumentOutOfRangeException fırlatır: negatif bir startIndex, Length'ten büyük bir startIndex, negatif bir length ya da Length'ten büyük bir startIndex + length. Python dilimlerinin aksine sessiz bir kırpma yoktur.
Çıktı:
Substring(2, 4) -> "ffee"
Substring(2, 5) -> ArgumentOutOfRangeException
Substring(6) -> ""
Substring(7) -> ArgumentOutOfRangeException
Substring(-1) -> ArgumentOutOfRangeException
Substring(0, 10) -> ArgumentOutOfRangeException
Olağan koruma, uzunluğu Math.Min ile string'de kalan kısma sınırlamaktır:
Çıktı:
ffee
ea
[]
[]
null bir string üzerinde Substring çağırmak ArgumentOutOfRangeException değil NullReferenceException fırlatır; yardımcının önce null kontrolü yapmasının nedeni budur.
İlk ve son n karakter
Bir önek ya da sonek almak Substring'in en yaygın kullanımıdır. İkisi de string n'den kısa olduğunda istisna fırlatır, bu yüzden üretim kodu uzunluğu kontrol eder:
Çıktı:
**** 1111
An Unexpecte...
Hi
Hi
Atmak istediğiniz şey string'in ilk kısmıysa tek başına Substring(n) yeterlidir: "#FF8800".Substring(1) "FF8800"'dür. İlgili Remove(start, count) metodu Substring'in tersini yapar: o aralık çıkarılmış string'i döndürür.
IndexOf ile Substring
Gerçek alt string'lerin çoğu sayılmaz, bulunur. IndexOf bir karakterin ya da string'in konumunu (yoksa -1) döndürür, LastIndexOf ise sondan arar. Bir ayırıcının etrafındaki metni kesmek için onları Substring ile birleştirin:
Çıktı:
maya.lopez
example.com
pdf
report.final.v2
WARN
Disk almost full
Aritmetik tek bir kuralı izler: a ve b konumları arasındaki metni (ikisi hariç) almak için başlangıç a + 1, uzunluk b - a - 1'dir.
Tehlike, IndexOf'un -1 döndürmesidir. email.Substring(0, -1) istisna fırlatır; daha kötüsü, email.Substring(-1 + 1) sessizce tüm string'i döndürür. Her zaman kontrol edin:
Çıktı:
shop.io
(none)
Alternatif olarak Split
Bir string ayırıcıyla ayrılmış alanlardan oluşan bir listeyse Split, bir IndexOf ve Substring çağrıları zincirinden daha basittir ve yanlış yapılacak indeks aritmetiği içermez:
Çıktı:
Ana Silva
Porto
maya.lopez
beach.jpg
Split bir dizi ve alan başına bir string ayırır, bu yüzden sıcak bir döngüdeki tek bir kesme için IndexOf ve Substring daha ucuzdur. Geri kalan her durumda okunabilirlik kazanır. Daha fazla seçenek (birkaç ayırıcı, boş girdileri atmak, en fazla sayı) string metotları sayfasındadır. "ID:'den sonraki rakamlar" gibi desenler için bir düzenli ifade genellikle en anlaşılır araçtır.
Aralık operatörü (C# 8 ve sonrası)
C# 8, string'lerde ve dizilerde çalışan indeks ve aralık sözdizimini ekledi. ^n "sondan n" demektir ve a..b, a'dan b'ye kadar olan ama b'yi içermeyen aralıktır; yani ikinci sayı uzunluk değil bitiş indeksidir:
// C# 8 and later
string sku = "SHOE-4271-BLK";
string first4 = sku[..4]; // "SHOE" same as Substring(0, 4)
string middle = sku[5..9]; // "4271" same as Substring(5, 4)
string last3 = sku[^3..]; // "BLK" same as Substring(sku.Length - 3)
string noEnds = sku[1..^1]; // "HOE-4271-BL" drop first and last
char lastChar = sku[^1]; // 'K'
Bir string üzerinde aralık bir Substring çağrısına derlenir, bu yüzden yeni bir string ayırır ve aynı sınır dışı durumlarda ArgumentOutOfRangeException fırlatır. Hangisinin kullanılacağı stil meselesidir; iki uç farklı taraflardan ölçüldüğünde ([1..^1]) aralıklar daha iyi okunur.
Kopyalamadan alt string'ler: Span
Her Substring çağrısı yeni bir string ayırır. Performansa duyarlı parse kodunda (büyük dosyaları okumak, çok sayıda isteği işlemek) .NET Core 2.1 ve sonrası, orijinal string'in bir kısmına kopyasız bir görünüm olan ReadOnlySpan<char>'ı sunar:
ReadOnlySpan<char> line = "2026-09-24,42.50,EUR".AsSpan();
ReadOnlySpan<char> amount = line.Slice(11, 5); // "42.50", no allocation
decimal value = decimal.Parse(amount, provider: CultureInfo.InvariantCulture);
Span'ler sıradan sınıfların alanlarında saklanamaz ve await boyunca kullanılamaz, bu yüzden sıkı, eşzamanlı koda aittirler. Tipik uygulama kodu için doğru araç Substring'dir.
Yaygın hatalar
- Uzunluk yerine bitiş indeksi vermek.
s.Substring(2, 5)"2'den 5'e kadar" değil, 2 indeksinden itibaren beş karakter demektir.aindeksindenbindeksine kadar (bhariç) metni almak için uzunlukb - a'dır. IndexOf'u -1 için kontrol etmemek. Ya bir istisna ya da+ 1ile yanlışlıkla tüm string.- Kısa string'lerin yeterince uzun olduğunu varsaymak. Bir ad, kod ya da dosyadan bir satır beklediğinizden kısa olabilir.
Math.Minile sınırlayın ya daLength'i kontrol edin. - Sonucu atmak. Kendi satırında
s.Substring(1);işe yarar hiçbir şey yapmaz.
Sıkça Sorulan Sorular
C#'ta Substring nasıl çalışır?
s.Substring(start) start indeksinden sona kadar olan karakterleri döndürür; s.Substring(start, length) ise start'tan başlayan length kadar karakteri döndürür. İndeksler 0'dan başlar ve ikinci argüman bir bitiş indeksi değil uzunluktur: "Hello".Substring(1, 3) "ell"'dir. Orijinal string değişmez.
Substring neden ArgumentOutOfRangeException fırlatır?
Çünkü start negatiftir ya da string'in uzunluğundan büyüktür veya start + length sonu aşar. En yaygın neden, daha uzun bir string için hesaplanmış bir uzunluk ya da başlangıç olarak kullanılan -1 değerli bir IndexOf sonucudur. Uzunluğu Math.Min(length, s.Length - start) ile sınırlayın ve IndexOf sonuçlarını kullanmadan önce kontrol edin.
C#'ta bir string'in son n karakteri nasıl alınır?
n <= s.Length olması koşuluyla s.Substring(s.Length - n) son n karakteri döndürür. Kısa string'lerde güvenli olmak için s.Length <= n ? s : s.Substring(s.Length - n) kullanın. C# 8 ve sonrasında s[^n..] de yazabilirsiniz; n fazla büyük olduğunda aynı şekilde istisna fırlatır.
C#'ta iki karakter arasındaki metin nasıl alınır?
İki konumu da IndexOf ile bulun, sonra aradaki kısmı alın: int start = s.IndexOf('(') + 1; int end = s.IndexOf(')', start); string inside = s.Substring(start, end - start);. Substring'i çağırmadan önce her IndexOf'un bir şey bulduğunu (-1 olmadığını) kontrol edin. Karmaşık desenler için bir düzenli ifade daha anlaşılırdır.
C#'ta Substring sıfır tabanlı mı?
Evet. İlk karakter 0 indeksindedir, sonuncusu Length - 1'de. Substring(0, 3) ilk üç karakteri döndürür. Başlangıç olarak Length'in kendisini vermek serbesttir ve boş bir string döndürür.