2009-08-24 8 views
3

次のコード最後の2文字列を削除char!

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

は、次に、動的に作成GridViewに結合される、例えば、 "A、B、C、(空間)" のような出力を生成しなければなりません。私は最後の2文字の文字列、つまり "、(スペース)"を削除したいと思います。これどうやってするの?

答えて

4

私が最初の場所でそれらを追加しないでしょう:)あなたは、文字列に.TrimEnd(「」.ToCharArrayを())を使用することができ、またはあなたがSUBSTRINGを使用することができます

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 spoted –

1

"A、B、C"から "A、B、C"を取得したいようです。単純な文字列操作のビットは、ジョブを実行する必要があります。

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

それは私はあなたが後にしていると考えているものです最後のコンマ、探しので、これは、単に最後の2つの文字を削除するよりも汎用性があります。

もちろん、これらの2つの文字を最初に追加しているということは、少しばかげているようです。しかし、これを避ける方法を示すためにはもっと文脈を見る必要があります。

+0

は –

1

を試してみてください。

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

最後の2つの文字を操作することなく、あなたがやりたいことがある、String.Joinを見てみましょう。

+0

配列から(入力として)正確には始まらないのですが... –

+0

String.Joinは文字列の配列をとります。 'checkboxList.Items'は配列ではなくコレクションクラスです。 – awe

0

これは、すべての末尾を削除、および/または[スペース]になるには:詳細については

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

、文字列の連結は高価です。あなたが実際にStringBuilderを使用しているように見えます(iから、その結果から)。 (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

真実ですが、典​​型的なテキストの長さを知る必要があります。一般的なケースでは、おそらく2倍のスキャンに値するものではありません。 –

+0

素晴らしいソリューション、Marc - これは私が実装したものです。 –

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

var result = String.Join(", ", selectedValues); 
関連する問題