C# 替换字符串。拆分
我有一个10,2/20,5/50,3格式的字符串 这是每个球员的胜利。 roomPrize、wins/nextRoomPrize、wins等 我知道怎么读了,但我想改变赢得一些奖金的数量。我已经走了这么远C# 替换字符串。拆分,c#,string,unity3d,C#,String,Unity3d,我有一个10,2/20,5/50,3格式的字符串 这是每个球员的胜利。 roomPrize、wins/nextRoomPrize、wins等 我知道怎么读了,但我想改变赢得一些奖金的数量。我已经走了这么远 winsRawData = getStatW.text; //That is the wins string formated as explained above string[] winSplits = winsRawData.Split('/'); for(int i = 0; i
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
}
}
谢谢如果我能很好地理解你的问题,你可以做以下几点:
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 output=String.Join/,winSplits;在上述代码的末尾,您将得到一个字符串输出:
"100,2/20,5/50,3"
有关完整示例,请参见下面的代码:
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"
您应该首先重构以将数据反序列化为一些玩家对象,更改其wins计数,然后将其序列化回:
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);
}
}
}
它的代码要多得多,但更易于维护。那么,是什么阻止了你?是不是很熟悉的图案好,真的很烦躁的图案,你不应该使用它。而是创建一个数据结构,并直接更新它,而不是在必要时转换为字符串。。。对于问题本身,您需要展示您期望的内容以及您拥有的代码不起作用的原因,或者询问您需要做什么,并使用您尝试过的示例代码。当前状态下的帖子质量不高。问题问得不好,但答案写得很好+1如果我理解得很好,那么最终更新的字符串将是所有winSplits的组合?@J.Doe请查看返回原始格式代码的编辑。是的,就是这样,非常感谢您,并为问得不好感到抱歉。记住检查问题的标签,您的答案是控制台应用程序,而问题是统一的。逻辑是正确的,但有些用法是错误的。主方法,控制台类你是对的@Everts,我没有注意到标签,我的坏。
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);
}
}
}