Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换字符串。拆分_C#_String_Unity3d - Fatal编程技术网

C# 替换字符串。拆分

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

我有一个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 < 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);
        }
    }
}