2017-03-17 4 views
-4

"10,2/20,5/50,3"という形式の文字列があります。C#Replace String.Split

これはすべてのプレーヤーの勝ちです。 "roomPrize、wins/nextRoomPrize、wins"

私はそれを読む方法を考え出しましたが、私はいくつかのroomPrizeの勝利の量を変更したいと思います。私はこれまでに来ました。私はよくあなたの質問を理解する場合は、次の操作を実行したいと思います

winsRawData = getStatW.text; //That is the wins string formated as explained above 

string[] winSplits = winsRawData.Split('/'); 

for(int i = 0; i < winSplits.Length; i++) 
{ 
    if(winSplits[i].Split(',')[0] == room.ToString()) //room is the roomPrize that i want to affect 
    { 
     //newWins is the new win count that I want to update with 
     //winSplits[i].Split(',')[1] == newWins; <-- I just need to do that 
    } 
} 

おかげ

+1

あなたを止めるのは何ですか? – UnholySheep

+2

[文字列型コード](https://www.bing.com/search?q=stringly+typed+code)はよく知っているパターン(大丈夫、本当にパターン)です。使用しないでください。代わりにデータ構造を作成し、必要に応じて文字列に変換するよりも直接更新してください...質問自体について - あなたが期待していることとあなたが持っているコードがなぜ動作しないのかを示す必要があります。あなたが試したことの例。現在の状態の投稿はSOの品質バーを満たしていません。 –

答えて

2

winSplits[i].Split(',')[1] = newWins; 

これを達成するために、あなたは再び、その後、値を分割する必要がありますそれを作成して元の配列に戻します。

var winsRawData = "10,2/20,5/50,3"; 
int room = 10; 
int newWins = 100; 

そして、上記のコードの最後にvar output = String.Join("/", winSplits);を追加することにより

、あなたは文字列を取得します:次の値を使用して

winsRawData = getStatW.text; //That is the wins string formated as explained above 

string[] winSplits = winsRawData.Split('/'); 

for (int i = 0; i < winSplits.Length; i++) 
{ 
    var dataArray = winSplits[i].Split(','); 
    if (dataArray[0] == room.ToString()) //room is the roomPrize that i want to affect 
    { 
     // sets the new value. 
     dataArray[0] = newWins; 
    } 

    // finalize by recreating the string and push it back to the original array 
    winSplits[i] = String.Join(",", dataArray); 
} 

編集

以下は、トリックを行う必要があります出力:

"100,2/20,5/50,3" 

次のコードを参照してくださいmplete例:

string[] winSplits = winsRawData.Split('/'); 


for (int i = 0; i < winSplits.Length; i++) 
{ 
    var dataArray = winSplits[i].Split(','); 
    if (dataArray[0] == room.ToString()) //room is the roomPrize that i want to affect 
    { 
     // sets the new value. 
     dataArray[0] = newWins.ToString(); 
    } 

    // finalize by recreating the string and push it back to the original array 
    winSplits[i] = String.Join(",", dataArray); 
} 

var output = String.Join("/", winSplits); // = "100,2/20,5/50,3" 
+0

よくある質問ではなく、よく書かれた回答です。 +1 – Brian

+0

私がよく理解すれば、最後に更新された文字列はすべてwinSplitsになりますか? –

+0

@ J.Doe「元のフォーマットに戻る」コードの編集を参照してください。 – StfBln

1

あなたはまず、いくつかのプレーヤーオブジェクトにデータをデシリアライズするためにリファクタリングそれは勝利をカウントし、それをバックシリアライズです変更する必要があります。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Raw data 
      string rawData = "10,2/20,5/50,3"; 

      // First split 
      string[] playersRaw = rawData.Split('/'); 

      // Initialize a collection for the player objects 
      var players = new List<Player>(); 

      // Iterates over the splitted players data 
      foreach (var playerRaw in playersRaw) 
      { 
       // Deserialize each player 
       var playerDeserialized = Player.Deserialize(playerRaw); 

       // Store the player data into the players collection 
       if (playerDeserialized != null) 
        players.Add(playerDeserialized); 
      } 

      // Seeks for player with room prize 10 
      foreach (var player in players) 
      { 
       if (player.RoomPrize == 10) 
        // Increments players data wins count 
        player.Wins += 1; 
      } 

      // Updates the raw data serializing all players back again 
      rawData = string.Join("/", Array.ConvertAll(players.ToArray(), (p) => p.Serialize())); 

      Console.WriteLine(rawData); 

      Console.ReadLine(); 
     } 
    } 

    class Player 
    { 
     public int RoomPrize { get; set; } 

     public int Wins { get; set; } 

     public static Player Deserialize(string data, char separator = ',') 
     { 
      Player player = null; 
      string[] splittedData = new string[] { }; 

      if (!string.IsNullOrEmpty(data) && (splittedData = data.Split(separator)).Length == 2) 
      { 
       int roomPrize = 0, wins = 0; 
       if (int.TryParse(splittedData[0], out roomPrize) && int.TryParse(splittedData[1], out wins)) 
       { 
        player = new Player(); 
        player.RoomPrize = roomPrize; 
        player.Wins = wins; 
       } 
      } 

      return player; 
     } 

     public string Serialize() 
     { 
      return string.Format("{0},{1}", this.RoomPrize, this.Wins); 
     } 
    } 
} 

それははるかにコードだが、保守が容易です。

+0

質問のタグを確認することを忘れないでください。あなたの答えはコンソールアプリケーションですが、問題は1つです。ロジックは正しいですが、いくつかの使い方が間違っています(Mainメソッド、Consoleクラス) – Everts

+0

あなたは正しく@Evertsです。タグに気づいていない、悪いです。 –