2009-07-20 5 views
5

Строки имеют следующий шаблонExtract Все символы после последнего вхождения шаблона C#

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

Ищу кода, который будет читать последнюю созданную строку и приросте последнюю цифру на 1 и сохранить его как новая строка.

Как это сделать?

С наилучшими пожеланиями,

Волшебное

+3

Это одна строка или список строк? –

+0

Список строк. Последняя созданная строка будет той, где самая последняя цифра. – 2009-07-20 13:38:18

ответ

6

Вы можете разбить строку на компоненты, разобрать последний, так что вы можете увеличить его, и поставить их снова вместе:

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

другой метод, который может быть несколько более эффективным, состоит в том, чтобы получить только последний компонент с использованием струнных операций:

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 Что я предполагаю, это каламбур? (Имя OP - Magic) –

0

Если предположить, что список строк является:

List<string> stringList; 

Вы можете получить последнюю запись в этом списке с помощью:

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

Тогда получите последний символ этой строки с помощью:

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

Преобразование и приращение символа в десятичной системе:

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

Наконец, скопируйте исходную строку и заменить последний номер с новым:

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

Теперь добавьте его обратно к первоначальному списку:

stringList.Add(finalString); 
0

Предполагая, что только последний элемент в дополнительных строках:

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

Я использую VB прямо сейчас, bu t перевод на C# должен быть простым. Отсюда реализация вашей реальной проблемы должна быть простой: у вас есть коллекция, последний элемент - это последний номер, просто увеличивайте его и заменяйте последний элемент коллекции и записывайте ее снова.

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

Предполагая, что формат не изменится, это может быть вашим лучшим решением. Это будет работать даже с неупорядоченными строками списка версий.

 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

Это хорошее решение. Если какая-либо из строк содержит дополнительную точку или нецифровой символ, это приведет к сбою. Но если все строки находятся в правильном формате, это будет работать очень хорошо. – configurator

+0

Я бы не стал использовать Versions.Reverse(), хотя это пустая трата процессора. Простая версия maxVersion = Версии [Versions.Count - 1]; – configurator

+0

Правда. Оба списка (T) .Item и List (T) .Count() - O (1). List.Reverse() - O (n). –

3

Если ваше намерение, чтобы всегда получать последнюю подстроку после определенного символа (исключая символ-разделитель, конечно (в данном случае период)), который я считаю, это ваше намерение:

Держите его простой с 1 лайнером:

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

Я позволю другим сообщениям ответить на остальную часть вашего запроса.