C#:给定一个指定长度的字符串,根据位置和长度替换数组中的字符

本文关键字:位置 替换 字符 数组 字符串 一个 | 更新日期: 2024-09-12 12:46:21

给定我从XML文件中读取的以下值:

00B5057800A4143400B50578

并且,给定以下字符串:

string foo = "6F6F6F6F6F";

我想以某种方式将从XML文件中读取的字符替换为"foo"中的字符。然而,我想开始替换"00"之后的那些字符,并且只继续替换这些字符,使其等于"foo"的长度。因此,如果我有自己的方式,新的价值观将如下:

006F6F6F006F6F3400B50578

我试过几种方法来解决这个问题,但都无济于事。

假设我将XML值读取到一个名为"arrXmlValues"的数组中,我已经编写了如下代码…

        string foo = "6F6F6F6F6F";
        string[] arrXmlValues = new String[] { xmlReader.GetAttribute("w:val") };
        foreach (string r in arrXmlValues)
        {
            Console.WriteLine("Original value was : {0}", r);
            StringBuilder sb = new StringBuilder(r);
            sb.Remove(2, foo.Length);
            sb.Insert(2, foo);
            Console.WriteLine("New value is : {0}", sb);
            Console.WriteLine("");
        }

这里需要注意的是,八位数的十六进制值块必须保持原样。因此,我一次只能替换每个块中的6个字符,并且任何没有写入列表上第一个块的字符都必须写入列表上的第二个块,但前提是我必须根据变量"foo"进行写入

当然,对实现这一目标的新方法以及你可能提供的任何想法持开放态度。我不是一个很强的程序员,但我在这里的目标是为学校项目解决这个问题,同时也学习。

我感谢任何帮助和指导。实现这一目标的示例代码将非常棒。非常感谢。

C#:给定一个指定长度的字符串,根据位置和长度替换数组中的字符

这是一个有趣的游戏。关键是在处理输入字符串之前将其分解为更小的子集,因为您需要保持空格对齐。

static void Main(string[] args)
{
    string input = "00B50578 00A41434 00B50578";
    string foo = "6F6F6F6F6F";
    // start with a queue of characters filled with the
    // letters we are going to put into the input string.
    Queue <char> fooQueue = new Queue<char>(foo); 
    StringBuilder result = new StringBuilder();
    // iterate through each split, so that we maintain spaces.
    foreach (var item in input.Split(' '))
    {
        // go through each set of two characters in this specific chunk.
        for (int i = 0; i < item.Length - 1; i += 2) 
        {
            var substring = item.Substring(i, 2); // look at each chunk.
            if (substring == "00") // if the chunk is 00, then append 00. 
            {
                result.Append("00");
            }
            else // otherwise
            {
                // take either the next two characters out of the queue
                //and append them, or if the queue is empty, append the 
                //letters from the original text.
                for (int j = 0; j < 2; j++) 
                {
                    if (fooQueue.Count >= 1)
                        result.Append(fooQueue.Dequeue());
                    else
                        result.Append(substring[j]);
                }
            }
        }
        // add a space at the end of the chunk. 
        result.Append(' ');
    }
    // print all the chunks, but trim the end (which should at 
    // this point have an additional space at the end.
    Console.WriteLine(result.ToString().Trim());
}

这可以简单地使用for循环和一个变量(index)来跟踪foo字符串中剩余的字符数。

工作小提琴

string foo = "6F6F6F6F6F";
string[] arrXmlValues = new String[] { "00B50578", "00A41434", "00B50578" };
var index = 0;
foreach (string r in arrXmlValues)
{
    var arr = r.ToCharArray();  
    // magic is here
    for(var j = 2; j < arr.Length && index < foo.Length; j++) arr[j] = foo[index++];
    Console.WriteLine("Original value was : {0}", r);
    Console.WriteLine("New value is : " + new String(arr));
}