2009-12-07 17 views
76

Sto cercando di capire il modo migliore per ottenere tutto prima del carattere in una stringa. Alcune stringhe di esempio sono sotto. La lunghezza della stringa prima - varia e può essere di qualsiasi lunghezzaOttieni sottostringa - tutto prima di determinati caratteri

223232-1.jpg 
443-2.jpg 
34443553-5.jpg 

quindi ho bisogno il valore che è da l'indice di partenza da 0 a destra prima -. Così i sottostringhe sarebbero risultano essere 223.232, 443, e 34443553

risposta

96

.Net Fiddle example

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("223232-1.jpg".GetUntilOrEmpty()); 
     Console.WriteLine("443-2.jpg".GetUntilOrEmpty()); 
     Console.WriteLine("34443553-5.jpg".GetUntilOrEmpty()); 

     Console.ReadKey(); 
    } 
} 

static class Helper 
{ 
    public static string GetUntilOrEmpty(this string text, string stopAt = "-") 
    { 
     if (!String.IsNullOrWhiteSpace(text)) 
     { 
      int charLocation = text.IndexOf(stopAt, StringComparison.Ordinal); 

      if (charLocation > 0) 
      { 
       return text.Substring(0, charLocation); 
      } 
     } 

     return String.Empty; 
    } 
} 
+1

Questi tutti errore quando "s" non ha il trattino. –

+2

Si prega di fare un favore e di aggiungere il controllo degli errori anche supponendo che abbia intenzione di fare una funzione fuori da questo :) – Josh

+0

Grazie ero vicino a questo, ma era curioso se qualcuno avesse un modo diverso di farlo diverso da questa combo. Ma sì, funziona alla grande ed è ancora piuttosto breve. – PositiveGuy

42
String str = "223232-1.jpg" 
int index = str.IndexOf('-'); 
if(index > 0) { 
    return str.Substring(0, index) 
} 
+2

Questa risposta è decisamente migliore delle altre risposte migliori secondo me. – VoidKing

+0

Chiaro e facile da leggere, questa dovrebbe essere la risposta accettata. –

+0

upvote perché ho bisogno di conoscere l'indice del separatore –

2

Un modo per farlo è quello di utilizzare String.Substring insieme String.IndexOf:

int index = str.IndexOf('-'); 
string sub; 
if (index >= 0) 
{ 
    sub = str.Substring(0, index); 
} 
else 
{ 
    sub = ... // handle strings without the dash 
} 

partenza alla posizione 0, restituisce tutto il testo fino a, ma non incluso, il trattino.

+0

se index <= 0 dovresti solo restituire string.empty. –

+5

@NRNR: se lo dici tu. L'OP conosce i requisiti aziendali, non tu o io. –

74

Utilizzare la funzione split.

static void Main(string[] args) 
{ 
    string s = "223232-1.jpg"; 
    Console.WriteLine(s.Split('-')[0]); 
    s = "443-2.jpg"; 
    Console.WriteLine(s.Split('-')[0]); 
    s = "34443553-5.jpg"; 
    Console.WriteLine(s.Split('-')[0]); 

Console.ReadKey(); 
} 

Se la stringa non dispone di un - Allora ti ottenere l'intera stringa.

+3

E se hai più di un trattino, ottieni più elementi nell'array. –

+2

In effetti, James, quindi questa sarebbe solo una soluzione se ti aspettassi un solo trattino. Suppongo che potresti usare i metodi Linq come saltare e aggregare per ottenere ciò che volevi, ma poi hai più codice dei metodi che sono già stati proposti. Tutto dipende da quanto sai sui dati in arrivo. –

+3

E pochi anni dopo, mi sono appena reso conto che ero piuttosto troppo veloce per ammettere il punto di James.La domanda chiede come trovare la stringa prima di un determinato carattere. Ulteriori istanze di quel personaggio sono quindi irrilevanti e prendere [0] "funzionerebbe". Certo, dipende ancora da quanto ci fidiamo dei dati in arrivo. Cosa succede se non c'è niente? –

2

Le cose sono passate da un po 'dall'inizio di questa discussione.

Ora, è possibile utilizzare

string.Concat(s.TakeWhile((c) => c != '-')); 
+0

In che modo questo confronta le prestazioni con l'ovvia combinazione IndexOf e Sottostringa? Presumo che aggiunga ogni carattere a un StringBuilder e quindi produca una stringa alla fine. Ci sono anche un paio di chiamate di funzioni miste. Sarebbe stato bello se la Substring potesse semplicemente prendere -1 come argomento di "lunghezza" che significa "fine della stringa". – crush

+0

È peggio per l'efficienza. Come dici tu, usa un generatore di stringhe e dopo aver ispezionato il codice sembra che chiami ToString su ogni personaggio. È più chiaro se stai cercando più di un personaggio, poiché potresti riscrivere facilmente il lambda. –

Problemi correlati