2012-01-08 22 views
8

Kullanıcının bir dize biçiminde sayı listesi girdiği bir programım var. Bu sayı listesi her zaman 8'in katlarıdır. Bu nedenle, liste 8, 16, 32, 40, 48, vb. Sayıları içerebilir.Bir dizgiyi x karakter sayısına bölme

Bu dizeyi her 8 karaktere bölmem gerekiyor. Örneğin

, kullanıcının girdiği demek "1234123445674567"

I (0) olan bir dize dizisi bölmek can "12341234" ve (1) "45674567"

Not Nasıl:

Dim stringArray(txtInput.Text.Length/8) as String 

Edi: dizinin büyüklüğü bu gibi 8.

bölünmesiyle şeridin uzunluğuna eşit olması gerekir t: Bunu, 8 sayı sayan ve onu bir diziye ayıran bir döngü oluşturarak yapabileceğimi biliyorum, ancak bu uzun ve değişken olabilir ve bunu yapmanın daha etkili bir yolu olduğunu biliyorum. Ben sadece sözdizimini bilmiyorum. (Eğer gerçekten bir ihtiyaç varsa) strings.ToArray() kullanabilirsiniz

Dim strings As New List(Of String) 

For i As Integer = 0 To Me.txtInput.Text.Length - 1 Step 8 
    strings.Add(Me.txtInput.Text.Substring(i, 8)) 
Next 

bir diziye strings listesini dönüştürmek için:

cevap

4

Dim orig = "12344321678900987" 
Dim res = Enumerable.Range(0,orig.Length\8).[Select](Function(i) orig.Substring(i*8,8)) 
+4

Bu arada, VB '[Seç]' e ihtiyaç duymayacak kadar akıllıdır. – Ryan

+0

@minitech VB sözdizimi hakkında hiçbir fikrim yok - Ben bu sorguyu otomatik olarak C# 'ye çevirdim :) – dasblinkenlight

+3

Evet, kimse artık VB yazmak istemiyor :) VB'deki anahtar kelimeler bir '.' Den sonra anahtar kelimelerle kaçmak zorunda değil. ] hepsi. Yani bunun yerine "Seç" ile biraz daha iyi hale getirebilirsiniz. – Ryan

4

Bir For döngü ve Substring kullanabilirsiniz.


Ayrıca, bir fantezi tek gömleklerinin düzenli ifadeler ve LINQ kullanabilirsiniz: Bu 8 karakterlik alt dizeleri bir diziye dize ayrılmalıyız

Text.RegularExpressions.Regex.Matches(Me.txtInput.Text, ".{8}").Select(Function(x) x.Value) 
+0

Cevabınızı diğerlerinden daha çok beğeniyorum. Özellikle tek liner çok verimli görünüyor. Çalıştırmak için programıma eklemem gereken veya eklemem gereken başka şeyler var mı? Ben test edeceğim ve eğer çalışırsa cevabınızı kabul edeceğim –

+1

@ MarkKramer: Hayır, olmamalı. Tek liner sadece .NET 3.5 ve üstü (VB 2008 veya üstü) olan LINQ'a ihtiyaç duyuyor, ancak ilk olarak pratikte her şey çalışıyor. – Ryan

+0

LINQ, kullanıcının kendi bilgisayarında yüklü olması gereken bir şey midir? Ya da sadece Visual Studio ile birlikte gelen ihtiyacım olan şey –

0
Function slice(ByVal s as String) As String() 
    Return (From c As String in s).ToArray() 
End Function 
+2

Bu sorunun bir çözüm olduğundan emin değilim. Dilimin uzunluğu nerede geçiyor? –

0

Kabul edilen yanıtı genişletmek için, bu, dizenin bölüm tarafından bölünemez olmasa bile bir dizeyi parçalara böler.

Public Function SplitInParts(s As String, partLength As Integer) As IEnumerable(Of String) 
     If String.IsNullOrEmpty(s) Then 
      Throw New ArgumentNullException("String cannot be null or empty.") 
     End If 
     If partLength <= 0 Then 
      Throw New ArgumentException("Split length has to be positive.") 
     End If 
     Return Enumerable.Range(0, Math.Ceiling(s.Length/partLength)).Select(Function(i) s.Substring(i * partLength, If(s.Length - (i * partLength) >= partLength, partLength, Math.Abs(s.Length - (i * partLength))))) 
    End Function