2016-10-17 12 views
3

名前のリストがあり、文字列変数(Bob、George、Will、Terry)にカンマ区切りのリストを作成するために名前のリストをループします。C#での文字列の置換

最終的に(Bob、George、Will and Terry)のようにリストが必要です。

コンマの最後のインスタンスを見つけて、それを単語「and」に置き換えるにはどうすればよいですか?最後のインスタンスを見つけたら、それは単純な問題だと思う。

string new=ori.Substring(0,start) + rep + ori.Substring(start+rep.Length); 

思考?コメント?提案?

おかげで、 ボブ

+5

、役立ちます。また、文字列関数 'LastIndexOf'を使用して、最後のカンマのインデックスを見つけることができます。 – adv12

+0

[ask]と[mcve]の作成方法をお読みになることをお勧めします。 –

+0

ループスルーすると、uは各ループで1ずつ増加するインデックス番号を持ちます。現在のインデックス番号が(Array list size - 1)と等しい場合、それは最後の要素です。ループの現在のインデックスは、配列またはリストのサイズより1小さいことを意味します。あなたにアイデアがありますように。 –

答えて

3

これはうまくいくはずです。代わりのコンマスタイルも追加されました。あなたはLINQを使用することができます

var names = "Bob, George, Will, Terry"; 
var lastCommaPosition = names.LastIndexOf(','); 
if (lastCommaPosition != -1) 
{ 
    names = names.Remove(lastCommaPosition, 1) 
       //.Insert(lastComma, " and"); 
       .Insert(lastCommaPosition, ", and"); 
} 

Console.WriteLine(names); 
+1

ありがとう、私は代わりのコンマスタイルも好きです。 –

1

これはあなたのためにトリックを行う必要があります。

var foo = "Bob, George, Will, Terry"; 
if (foo.Contains(",")) { 
    foo = foo.Substring(0, foo.LastIndexOf(",")) + " and" + foo.Substring(foo.LastIndexOf(",")+ 1); 
} 
+0

その行を追加すると、次のエラーが発生します。 –

+0

上記の行を追加すると、次のエラーが発生します。 例外の詳細:System.ArgumentOutOfRangeException:Lengthはゼロより小さくなることはできません。 パラメータ名:長さ –

+0

これは、文字列にコンマが含まれていない場合が考えられます。カンマをチェックする必要があります。そうでなければ、 'LastIndexOf'は-1を返します。私は上記の例を更新しました。 – codechurn

1

あなたは、LINQとString.Joinの組み合わせを使用することができます。このソリューションは最後のインデックスをカンマでは必要とせず、読みやすくするために "もっと流暢"です。

var list = new List<string> { "Bob", "George", "Will", "Terry" }; 
var listAsString = list.Count > 1 
     ? string.Join(", ", list.Take(list.Count - 1)) + " and " + list.Last() 
     : list.First(); 
+0

リストの長さが '1'のためにちょっと気になりません。 – grek40

+0

@ grek40 - あなたは正しいです。私はリストの長さをチェックするコードを編集しました。 –

+0

先に進み、 '0'の長さもチェックするか、' First() 'の呼び出しによって例外が発生します。 – Jay

0

私はあなたがやりたいのかわからないんだけど、次のコードは動作します:

string original = "(Bob, George, Will, Terry)"; 
      string result = ""; 
      string[] splited = original.Split(','); 
      for (int i = 0; i < splited.Count(); i++) 
      { 
       if(i == splited.Count() - 2) 
       { 
        result += splited[i] + " and"; 
       } 
       else if(i == splited.Count() - 1) 
       { 
        result += splited[i]; 
       } 
       else 
       { 
        result += splited[i] + ","; 
       } 
      } 

私は交換するためにこのベクターで働いていたので、私はベクトルで元の文字列を分割する分割を使用します単語 "and"の最後のコンマ。

1

list.Select(i => i).Aggregate((i, j) => i + (list.IndexOf(j) == list.Count -1 ? " and " : " , ") + j); 

希望はオックスフォードコンマを使用し、最も重要なのはまず第