2017-03-17 81 views
-4

我有一個字符串格式 「10,2/20,5/50,3」C#替換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

[stringly typed code](https://www.bing.com/search?q=stringly+typed+code)是很好的模式(好的,真的是anty-pattern),你不應該使用它。創建一個數據結構,並直接進行更新,而不是在必要時將其轉換爲字符串......對於問題本身 - 您需要顯示您期望的內容,爲什麼代碼不起作用或詢問您需要做什麼以及使用代碼你嘗試過的例子。目前狀態下的帖子不符合SO質量標準。 –

回答

2

如果我明白你的問題好了,你想做到以下幾點:

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

爲了實現這一點,你就需要拆分值,然後重新創建它(例如Join)並將其放回原始數組中。

下面應該做的伎倆:

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); 
} 

編輯使用以下值:

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

,並通過在上面的代碼的末尾添加var output = String.Join("/", winSplits);,你會得到一個字符串輸出:

"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

記住檢查問題上的標籤,你的答案是一個控制檯應用程序,而問題是統一。邏輯是正確的,但一些用法是錯誤的(主要方法,控制檯類) – Everts

+0

你說得對@Everts,我沒有注意到標籤,我的壞。 –