2012-06-14 14 views
9

Ok ragazzi, so che se/else funziona, avevo bisogno di un'alternativa.La sottostringa non funziona come previsto se la lunghezza è maggiore della lunghezza della stringa

Sto usando

B = String.Concat(A.Substring(0, 40)); 

per catturare i primi 40 caratteri di un valore.

Se il valore alla A è superiore 40, B è in grado di catturare, ma se il valore di A è inferiore 40, non v'è alcun valore di essere catturato a B.

+4

Perché si sta chiamando 'String.Concat' con un solo ingresso? – Rawling

+1

Qual è lo scopo di 'String.Concat()'? Ypu normalmente lo usa per unire due stringhe insieme, ma stai passando solo una stringa? – DaveShaw

+0

_ "ma se la [lunghezza del] valore di A è inferiore a 40, non viene acquisito alcun valore in B." _ - probabilmente perché si è verificata un'eccezione. – CodeCaster

risposta

10

Non capire lo scopo di passare solo un'unica stringa in String.Concat. Il vostro scopo può essere risolto:

if(A.Length > 40) 
     B= A.Substring(0,40); 
else 
     B=A; 
34

veloce e sporco:

A.Length > 40 ? A.Substring(0, 40) : A 
+0

+1 Le persone mi picchiano sempre al massimo. = P – benjer3

+23

Simile rapido e sporco: 'A.Substring (0, Math.Min (40, A.Length))' – ean5533

+3

Di sicuro, ma perché dovrebbe essere sporco :)? –

5

È possibile utilizzare Left da Microsoft.VisualBasic.Strings.

B = Microsoft.VisualBasic.Strings.Left(A, 40); 

Non so perché si desidera utilizzare Concat, in ogni caso.

+0

@Ramhound In che modo esattamente questo fallirà? L'hai mai provato? Non penso che tu sappia cosa fa "Sinistra". – sloth

+2

L'utilizzo di 'Left' è anche considerato una cattiva pratica in VB.NET, per non parlare dell'importazione del namespace VB-legacy in C# per utilizzarlo lì ... – Ryan

+0

@dkson - Fine. Ho preso un altro sguardo al metodo. Se la lunghezza è più lunga della lunghezza della stringa viene restituita l'intera stringa. Continuo a sostenere che questa è una cattiva pratica e quindi una cattiva risposta, quindi continuerò a mantenere il mio voto negativo. –

18

Perché non creare un'estensione per esso ... chiamalo Tronca o Sinistra, o qualsiasi altra cosa.

public static class MyExtensions 
{ 
    public static string Truncate(this string s, int length) 
    { 
     if(s.Length > length) return s.Substring(0, length); 
     return s; 
    } 
} 

Poi si può semplicemente chiamare in questo modo:

string B = A.Truncate(40); 

Si noti inoltre che non c'è bisogno di farne un metodo di estensione, anche se sarebbe più pulito.

Nella classe StringTool:

public static string Truncate(string value, int length) 
    { 
     if(value.Length > length) return value.Substring(0, length); 
     return value; 
    } 

E chiamarlo:

string B = StringTool.Truncate(A, 40); 
+0

truncate sarebbe la soluzione giusta, c'è già un numero enorme di if/els nel codice. – Lordlebu

+0

@Lordlebu - Perché stai cercando di ridurre il numero di istruzioni if ​​/ else esattamente? –

+0

ok un errore - emlMessage.cs (198,35): errore CS0117: 'stringa' non contiene una definizione per 'Truncate', ho provato StringTool, non funziona ancora – Lordlebu

5

utilizzo qui di seguito il codice per sottostringa

B = String.padright(40).Substring(0, 40)) 
+0

Adoro questa soluzione in realtà –

+0

Ma dopo il testo ci sono molti spazi. Si dovrebbe usare questo: 'B = String.padright (40, '\ 0'). Sottostringa (0, 40))' – Gh61

+0

Semplice ed elegante, plus può essere utilizzato in linea senza metodo aggiuntivo – jolySoft

7

estensioni sono i migliori per i problemi come questo;) miniera di avere qualche nome sporca, ma tutti sanno che cosa avrebbe fatto - questo è un'eccezione stringa sicura:

public static string SubstringNoLongerThanSource(this string source, int startIndex, int maxLength) 
{ 
    return source.Substring(startIndex, Math.Min(source.Length - startIndex, maxLength)); 
} 
3
B = string.Concat(A.Substring(0, Math.Min(40, A.Length))); 
Problemi correlati