2012-06-14 3 views
9

Хорошо, ребята, я знаю, работает ли/else, мне нужна была альтернатива.Подстрока не работает, как ожидалось, если длина больше длины строки

Я использую

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

захватить первые 40 символов значения.

Если значение в A более 40, B способен захватить, но если значение A меньше 40, нет никакого значения захвата в B.

+4

Почему вы называете 'String.Concat' с одним входом? – Rawling

+1

Какова цель 'String.Concat()'? Обычно Ypu использует его для объединения двух строк вместе, но вы проходите только в одной строке? – DaveShaw

+0

_ ", но если значение [length] для A меньше 40, в B не фиксируется значение." _ - возможно, потому что произошло исключение. – CodeCaster

ответ

10

Не понимая цель передавая только одну строку в String.Concat. Ваша цель может быть решена:

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

Быстрый и грязный:

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

+1 Люди всегда избивали меня до удара. = P – benjer3

+23

Подобный быстрый и грязный: 'A.Substring (0, Math.Min (40, A.Length))' – ean5533

+3

Быстро, но почему это должно быть грязно :)? –

5

Вы можете использовать Left из Microsoft.VisualBasic.Strings.

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

Не знаю, почему вы хотите использовать Concat, во всяком случае.

+0

@Ramhound В каком именно смысле это произойдет? Вы даже проверили это? Я не думаю, что вы знаете, что делает «Левый». – sloth

+2

Использование 'Left' даже считается плохой практикой в ​​VB.NET, не говоря уже об импорте пространства имен VB-legacy в C#, чтобы использовать его там ... – Ryan

+0

@dkson - Отлично. Я еще ДРУГО посмотрел на этот метод. Если длина длиннее, то длина строки возвращает всю строку. Я все еще утверждаю, что это плохая практика и, следовательно, плохой ответ, поэтому я буду поддерживать свой голос. –

18

Почему бы не создать расширение для него ... назовите его Truncate или Left или что-то еще.

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

Тогда вы можете просто назвать это так:

string B = A.Truncate(40); 

Также обратите внимание, что вы не должны делать это метод расширения, хотя это было бы чище.

В классе StringTool:

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

И называть его:

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

truncate будет правильным исправлением, в коде уже есть очень большое количество if/elses. – Lordlebu

+0

@Lordlebu - Почему вы пытаетесь свести число операторов if/else точно? –

+0

ok одна ошибка - emlMessage.cs (198,35): ошибка CS0117: «строка» не содержит определения для «Truncate», я попробовал StringTool, до сих пор не работает – Lordlebu

5

использование ниже коды подстроки

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

Люблю это решение на самом деле –

+0

Но после текста есть много пробелов. Вы должны использовать это: 'B = String.padright (40, '\ 0'). Подстрока (0, 40))' – Gh61

+0

Простая и элегантная, плюс может использоваться inline без дополнительного метода – jolySoft

7

Расширения лучше всего подходит для таких проблем, как этот;) Mine есть грязное имя, но все знают, что он будет делать - это исключение безопасная подстрока:

public static string SubstringNoLongerThanSource(this string source, int startIndex, int maxLength) 
{ 
    return source.Substring(startIndex, Math.Min(source.Length - startIndex, maxLength)); 
} 
Смежные вопросы