2013-07-18 15 views
5

Wiem, że to pytanie zostałoby zadane nieskończenie wiele razy, ale utknąłem. mam coś ciąg jakNie można podzielić ciągu odpowiednio

"doc1; zmienna doc2; doc3; 12"

może to być coś podobnego

„doc1; zmienna doc2; doc3; Doc4; Doc5; 56 "

Jest to kilka fragmentów ciągów oddzielonych średnikiem, po których następuje liczba lub id.

Potrzebuję wyodrębnić numer/id i ciągi oddzielnie. Aby być dokładnym, mogę mieć 2 łańcuchy: jeden o "Doc1;Doc2;Doc3" lub "Doc1;Doc2;Doc3;Doc4" a drugi mając tylko numer/ID jako „12” lub „34” lub „45” itd I tak używam C# 3.5

Rozumiem, że to dość łatwe i dowcipne pytanie, ale ten facet utknął. Wymagana pomoc od ekspertów.

Pozdrowienia Anurag

+1

'var leList = yourString.Split (';'). ToList()' i w ostatnim elemencie masz ID -> 'var id = leList.Last()' – wudzik

+0

Co oznacza "mogę mieć 2 ciągi"? Jak pożądany wynik lub jako dane wejściowe? –

+0

@TimSchmelter żądane wejście – Anurag

Odpowiedz

1
string actual = "Doc1;Doc2;Doc3;12"; 
int lstindex = actual.LastIndexOf(';'); 
string strvalue = actual.Substring(0, lstindex); 
string id = actual.Substring(lstindex + 1); 
+0

thanku dla odpowiedzi – Anurag

7

string.LastIndexOf i string.Substring są kluczem do tego, co próbujesz zrobić.

var str = "Doc1;Doc2;Doc3;12"; 
var ind = str.LastIndexOf(';'); 
var str1 = str.Substring(0, ind); 
var str2 = str.Substring(ind+1); 
+1

+1, ta kombinacja działałaby tak długo, jak długo wzór był zawsze tym, co OP dawał jako przykład. Jednak proszę podać przykład kodu OP, masz 12 tys. Powtórzeń, wiesz, że dobry przykład daje przykład kodu. –

+0

dziękuję panu Tim ... Twoja odpowiedź brzmi ... – Anurag

+0

@MichaelPerrenoud Edytowałem w przykładzie, gdy pisałeś swój komentarz - nie miałem czasu, pomyślałem, że najpierw powinienem dostać tam pierwszą część. :) –

2

Możliwym rozwiązaniem byłoby to:

var ids = new List<string>(); 
var nums = new List<string>(); 

foreach (var s in input.Split(';')) 
{ 
    int val; 
    if (!int.TryParse(s, out val)) { ids.Add(s); } 
    else { nums.Add(s); } 
} 

gdzie input jest coś takiego jak Doc1;Doc2;Doc3;Doc4;Doc5;56. Teraz ids będzie zawierał wszystkie wartości podobne do Doc1, a nums będzie zawierał wszystkie podobne wartości z zakresu 56.

+0

Dzięki za odpowiedź ... Akceptuję odpowiedź – Anurag

4

Jednym ze sposobów:

string[] tokens = str.Split(';'); 
var docs = tokens.Where(s => s.StartsWith("Doc", StringComparison.OrdinalIgnoreCase)); 
var numbers = tokens.Where(s => s.All(Char.IsDigit)); 
+0

Dzięki Panu Timowi ... pomogło dużo – Anurag

2

Możesz spróbować jednej z dwóch opcji: (zakładając, że ciąg wejściowy w string str;

Approach 1

  1. Get LastIndexOf(';')
  2. Podziel string na podstawie index. Da ci to część string i .
  3. Podzielić string część i proces to
  4. Przetwarza int część

Podejście 2

  1. podzielić ciąg na ;
  2. uruchomić for Loop - for (int i = 0; i < str.length - 2; i++) - to string część
  3. Proces str [leng th - 1] osobno - to int part

proszę wziąć to jako punkt wyjścia, ponieważ nie może być inne podejścia do wdrożenia rozwiązanie tego

+0

thanku dla odpowiedzi – Anurag

3
String docs = s.Substring(0, s.LastIndexOf(';')); 
String number = s.Substring(s.LastIndexOf(';') + 1); 
+0

Thanku za odpowiedź – Anurag

Powiązane problemy