2009-07-20 10 views
5

Struny mają następujący wzórExtract wszystkie znaki po ostatnim wystąpieniem deseń C#

1.0.0.0 
1.0.0.1 
1.0.0.2 
... 
... 
... 

szukam kodu, który będzie czytać ostatni utworzony ciąg i przyrost ostatnią cyfrę o 1 i zapisać go jako nowy ciąg.

Jak to zrobić?

Pozdrawiam,

Magia

+3

Czy jest to jeden ciąg znaków lub lista ciągów znaków? –

+0

Lista ciągów. Ostatni utworzony ciąg będzie taki, w którym ostatnia cyfra jest największa. –

Odpowiedz

6

można podzielić ciąg na składniki, analizować ostatnią tak, że można ją zwiększyć, i umieścić je razem znowu:

string[] parts = version.Split('.'); 
parts[3] = (Int32.Parse(parts[3]) + 1).ToString(); 
version = String.Join(".", parts); 

Another Metoda, która może być nieco bardziej efektywna, polega na uzyskaniu tylko ostatniego komponentu przy użyciu operacji na ciągach:

int pos = version.LastIndexOf('.') + 1; 
int num = Int32.Parse(version.Substring(pos)); 
version = version.Substring(0, pos) + num.ToString(); 
2
public string DoMagic(string s) 
{ 
    string t = s.Substring(s.LastIndexOf(' ')+1); 
    return t.Substring(0, t.Length-1) + (int.Parse(t[t.Length-1].ToString())+1).ToString(); 
} 
+2

+1 za to, co zakładam, jest kalambur? (Nazwa OP to Magic) –

0

Zakładając listę ciąg jest:

List<string> stringList; 

Można otrzymać ostatnią pozycję na tej liście, używając:

string lastString = stringList[stringList.Length - 1]; 

Następnie dostać ostatni znak tego łańcucha za pomocą:

char c = lastString[lastString.Length - 1]; 

Konwertuj i powiększaj znaki dziesiętne:

int newNum = Int32.Parse(c.ToString()) + 1; 

koniec skopiuj oryginalny łańcuch i zastąpić ostatni numer z nową:

string finalString = lastString; 
finalString[finalString.Length - 1] = c; 

teraz dodać ten z powrotem do oryginalnej listy:

stringList.Add(finalString); 
0

Zakładając, że tylko ostatni element w podciągach różni się:

List<string> items = GetItems(); 
string[] max = input.Split(' ').Max().Split('.'); 
string next = string.Format("{0}.{1}.{2}.{3}", max[0], max[1], max[2], int.Parse(max[3]) + 1); 
0

Ja jestem teraz śpiewaj VB, ale tłumaczenie na C# powinno być proste. Tutaj implementacja rzeczywistego problemu powinna być prosta - masz kolekcję, ostatni element jest ostatnim numerem, po prostu go zwiększ i zastąp ostatni element z kolekcji i zapisz go ponownie.

Imports System.Text.RegularExpressions 

Module Module1 

    Sub Main() 
     Dim matchC As MatchCollection = Regex.Matches("111.222.333", "\d+") 
     Dim i As Integer = 1 
     For Each x In matchC 
      Console.Write(i.ToString & " ") 
      Console.WriteLine(x) 
      i = i + 1 
     Next 
     ' remember to check the case where no matches occur in your real code. 
     Console.WriteLine("last number is " & matchC.Item(matchC.Count - 1).ToString) 
     Console.ReadLine() 
    End Sub 

End Module 
1

Przyjmując, że format nie ulegnie zmianie, może to być najlepsze rozwiązanie. To zadziała nawet w przypadku nieuporządkowanych ciągów list wersji.

 string VersionList = "1.0.0.0 1.0.0.1 1.0.0.2"; 

     List<Version> Versions = new List<Version>(); 

     foreach (string FlatVersion in VersionList.Split(' ')) 
      Versions.Add(new Version(FlatVersion)); 

     Versions.Sort(); Versions.Reverse(); 

     Version MaximumVersion = Versions[0]; 

     Version NewVersion = new Version(
      MaximumVersion.Major, 
      MaximumVersion.MajorRevision, 
      MaximumVersion.Minor, 
      MaximumVersion.MinorRevision + 1); 
+0

To jest dobre rozwiązanie. Jeśli którykolwiek z ciągów zawiera dodatkową kropkę lub znak inny niż numeryczny, to się nie powiedzie. Ale jeśli wszystkie łańcuchy mają poprawny format, będzie działać bardzo dobrze. – configurator

+0

Nie zrobiłbym wersji Versions.Reverse() - to marnowanie procesora. Prosta wersja maxVersion = Wersje [Versions.Count - 1]; – configurator

+0

Prawda. Zarówno List (T) .Item i List (T) .Count() są O (1). List.Reverse() to O (n). –

3

Jeśli twoim zamiarem jest, aby zawsze uzyskać ostatniego podciąg po szczególnym charakterze (bez znaku separatora oczywiście (w tym przypadku okres)), która moim zdaniem jest twoim zamiarem:

Keep it proste z 1 linią:

string myLastSubString = myStringToParse.Split('.').Last(); 

Pozwolę innym postom odpowiedzieć na resztę zapytania.

Powiązane problemy