去掉最后两个字符串字符!

3
以下代码:
If checkboxList.Items(i).Selected Then 
   .Fields("DESC1").Value += checkboxList.Items(i).Text + ", "
End If

应该会产生这样的输出:"A, B, C,(空格)",然后将绑定到一个动态创建的 GridView 下。我想要移除最后两个字符的字符串,即“,(空格)”。我该怎么做?

10个回答

7
看一下String.Join,它可能会满足您的需求,而无需操作最后两个字符。

String.Join需要一个字符串数组。checkboxList.Items是一个集合类,不是数组... - awe

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

在第一种情况下,您不需要使用+=。如果.Value可以为Null,这甚至可能是一个错误。 - kibibu
我应该说,在+=中你不需要+。 - kibibu
@kibibu:太棒了,你发现得真准确。 - Binary Worrier
它能够工作,但是 "IF String.IsNullOrEmpty(.Fields("DESC1").Value)" 会出错,"从类型 DBNull 转换为字符串无效"。所以,我将其更改为 "IF .Fields("DESC1").Value is System.DbNull.Value",然后它就可以工作了!谢谢..... - Fire Hand

3

顺便提一下,字符串拼接是比较耗费资源的。从代码中的和结果来看,你应该使用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

如果您大致知道字符串的总长度,通过像这样预先初始化StringBuilder的大小将更加高效(例如,如果每个项包括分隔符大约为6个字符长): StringBuilder sb = new StringBuilder(6 * checkboxList.Items.Count) 如果您分配的大小接近最终的实际大小,那么您将几乎不需要重新分配更多的内存。 - awe
是的,没错 - 但你需要知道典型的文本长度;在一般情况下,扫描两次可能不值得,只需让加倍算法处理即可。 - Marc Gravell
很棒的解决方案,Marc - 这就是我实施的方案。 - John Dunagan

1

看起来你只想从"A, B, C, "中获取"A, B, C"。一些简单的字符串操作就可以完成这个任务:

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

这比简单地删除最后两个字符更灵活,因为它寻找最后一个逗号,这应该是您想要的。

当然,首先添加这两个字符的事实听起来有点可疑。但是,我需要看到更多上下文才能展示如何避免这种情况。


如果输入为空,这将抛出一个异常。 - Binary Worrier

1

您可以在字符串上使用.TrimEnd(", ".ToCharArray()),或者您可以使用SubString:

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

0

使用

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

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

PS:如果语法不正确,请见谅 :)


0

这将移除所有尾随的逗号和/或空格:

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

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

var result = String.Join(", ", selectedValues); 

0

还有一个选项是“删除”:

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

-1

VB有三元if运算符吗?

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

是的,它确实有这个功能,但那不是全部。 - Binary Worrier
抱歉,我要更正一下,VB.Net没有三元运算符,但是有一个函数可以做类似于C#中的?:运算符的事情。然而,由于它是一个函数,它将始终评估两个语句。 - Binary Worrier
VB9 (.NET 3) 实际上具有三元运算符(作为真正的运算符)。它类似于旧的 IIf(...) 函数,但仅命名为 If(...),可以接受2或3个参数。 - awe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接