2009-08-24 4 views
3

Следующий код:удалить последние две строки char!

If checkboxList.Items(i).Selected Then 
    .Fields("DESC1").Value += checkboxList.Items(i).Text + ", " 
End If 

должен производить выход, такие как "A, B, C, (пробел)", который затем будет привязан к динамически создаваемых GridView. Я хотел бы удалить последнюю строку с двумя символами, то есть «, (пробел)». Как я могу это сделать?

ответ

4

Я бы не добавить их в первую очередь :) попробовать

If checkboxList.Items(i).Selected Then  
    if .Fields("DESC1").Value Is System.DbNull.Value then 
     .Fields("DESC1").Value = checkboxList.Items(i).Text 
    else 
     .Fields("DESC1").Value += ", " + checkboxList.Items(i).Text 
    End If 
End If 
+0

Вам не нужен + = в первом случае , Это может быть даже ошибка, если .Value может быть Null. – kibibu

+0

Я бы сказал, что вам не нужен + в + = – kibibu

+0

@kibibu: ta pal, well spotted –

1

Кажется, вы просто хотите получить «A, B, C» от ​​«A, B, C». Немного простых манипуляций со строками должен делать эту работу:

Dim input = "A, B, C, " 
Dim result = input.Substring(0, input.LastIndexOf(",")) 

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

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

+0

Это будет сгенерировано исключение, если вход пуст –

1

Вы можете использовать .TrimEnd («» .ToCharArray()) на строке, или вы можете использовать подстроку:

strLetters.Substring(0, strLetters.Length - 2) 
0

использование

.Fields("DESC1").Value += checkboxList.Items(i).Text + ", " 

. Fields("DESC1").Value = .Fields("DESC1").Value.TrimRight(new []{',',' '}); 

PS: - простите, если это не действует VB синтаксис :)

0

Существует также просто «Удалить»:

string k = "okay"; 
string s = k.Remove(k.Length - 2, 2); 
-1

ли VB есть трехкомпонентной если оператор?

If checkboxList.Items(i).Selected Then 
    .Fields("DESC1").Value += checkboxList.Items(i).Text + (i == checkboxList.Items.Length-1 ? "" : ", ") 
End If 
+0

Да, но это не так. –

+0

Что это? Я отредактирую ответ соответственно. –

+0

Извините, я исправлю себя, нет. VB.Net не является тройным оператором, но есть функция, которая делает что-то похожее на оператор?: В C#.Однако, поскольку это функция, она всегда будет оценивать оба утверждения. –

7

Посмотрите на String.Join, который может делать то, что вы хотите, без необходимости манипулировать последних двух символов.

+0

Он точно не начинается с массива (как вход), хотя ... –

+0

String.Join берет массив строк. 'checkboxList.Items' - это класс коллекции, а не массив ... – awe

0

Это удалит все завершающие и/или [пробел]:

.Fields("DESC1").Value = .Fields("DESC1").Value.TrimRight(", ".ToCharArrray()) 
3

Для получения информации, конкатенация дорого. Он выглядит (от i и от результатов), как будто вы действительно должны использовать StringBuilder; некоторые грубые псевдо-код (в C#, но тривиально перевести VB.Net):

StringBuilder sb = new StringBuilder(); 
for(int i = 0 ; i < checkboxList.Items.Count ; i++) { 
    if(checkboxList.Items[i].Selected) { 
     if(sb.Length > 0) sb.Append(", "); // add separator 
     sb.Append(checkboxList.Items[i].Text); // add text 
    } 
} 
someOjb.Fields("DESC1") = sb.ToString(); // use result 
+0

Если вы знаете приблизительную длину всей строки, будет еще эффективнее предварительно инициализировать размер StringBuilder чем-то вроде этого (пример if каждый элемент, включая разделитель, составляет приблизительно 6 символов): 'StringBuilder sb = new StringBuilder (6 * checkboxList.Items.Count)' Если размер, который вы выделяете, близок к фактическому размеру в конце, вы в конечном итоге или нет необходимости перераспределять больше памяти. – awe

+0

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

+0

Удивительное решение, Марк - это тот, который я реализовал. –

0
var selectedValues = checkboxList.Items 
    .Where(i => i.Selected) 
    .Select(i => i.Fields("DESC1").Value); 

var result = String.Join(", ", selectedValues); 
Смежные вопросы