在c#中将字符串转换为字符串[,]

时间:2011-06-21 03:09:19

标签: c# string

我有一个包含数据的字符串如下。如何将其分配给字符串[,]?

传递时的字符串具有如下值:

string test = "{ \"BusinessOrg\", \"BusinessOrgID\", \"BusinessOrg\", \"BusinessOrgID\"}, { \"BusinessParameters\", \"BusinessOrgID\", \"BusinessOrg\", \"BusinessOrgID\"}"

在文本可视化工具中查看时的内容如下:

  

{“BusinessOrg”,“BusinessOrgID”,   “BusinessOrg”,“BusinessOrgID”},{   “BusinessParameters”,“BusinessOrgID”,   “BusinessOrg”,“BusinessOrgID”}   “BusinessOrg”,“BusinessOrgID”,   “BusinessOrg”,“BusinessOrgID”},{   “BusinessParameters”,“BusinessOrgID”,   “BusinessOrg”,“BusinessOrgID”}

我无法将字符串分配给字符串[,]

string [,] strArray = test;

这是抛出错误无法将字符串转换为字符串[,]

4 个答案:

答案 0 :(得分:1)

您需要构建自己的解析器来处理您拥有的这种数据格式。假设此字符串的格式始终为{ "A1", "A2", ... }, { "B1", "B2", ... } ... ,则没有转义字符(也就是说,您不希望}"在你的子串中)然后代码实际上相当简单。

作为起点,您可以使用此算法说明。它没有经过优化,在解析方式上有点松懈(例如允许0个或多个逗号/空格字符) - 它只是一个起点。

  • (A)吃空格和逗号,直到看到第一个{
    • 分配新的string[]
    • (B)吃空格和逗号,直到看到第一个"}
      • 如果看到",请将字符读入缓冲区,直到再次看到"为止;将此缓冲区存储为当前数组中的字符串,必要时调整大小。从步骤(B)再次循环。
      • 如果看到},并且您尚未分配多维数组,请立即使用此数组的长度作为第二维;否则,只需将其存储在数组中,必要时调整大小。从步骤(A)再次循环。

如果在某个时刻,你到达输入的末尾,你应该退出循环并返回你的数组。

答案 1 :(得分:0)

如果您在代码中提供该字符串,则需要将其重新格式化为二维字符串(例如,新字符串[,] {{“a”,“b”},{“c”,“d “}})。如果您从其他来源获取该字符串,则需要先解析它。你拿一个字符串并告诉它将它转换为二维字符串数组,这是不可能的,因为你只提供一个字符串。

答案 2 :(得分:0)

这可能有助于第一步(假设字符串格式一致):

    String Input = "{ \"BusinessOrg\", \"BusinessOrgID\", \"BusinessOrg\", \"BusinessOrgID\"}, { \"BusinessParameters\", \"BusinessOrgID\", \"BusinessOrg\", \"BusinessOrgID\"}";

    String[] Segments = Input.Split(new string[] {"{", "}, {", "}"}, StringSplitOptions.RemoveEmptyEntries);

然后,您可以用逗号空格分割每个段。

答案 3 :(得分:0)

我写了一些蹩脚但可行的解决方案。让我们的编译器工作......:)

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Net;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string test = "{{ \"BusinessOrg\", \"BusinessOrgID\", \"BusinessOrg\", \"BusinessOrgID\"}, { \"BusinessParameters\", \"BusinessOrgID\", \"BusinessOrg\", \"BusinessOrgID\"}}";
            string [,] a = GetArray(test);

            string test2 = "{{ \"BusinessOrg2\", \"BusinessOrgID2\", \"BusinessOrg2\", \"BusinessOrgID2\"}, { \"BusinessParameters\", \"BusinessOrgID\", \"BusinessOrg\", \"BusinessOrgID\"}}";
            string[,] b = GetArray(test2);
        }

        static string[,] GetArray(string source)
        {
            if (source == null)
                throw new ArgumentNullException();

            string sourceCode = 
            @"namespace Sample
{
    public class ArrayConverter
    {
        public string [,] GetArray()
        {
            string [,] s = "+source + ";" +
@"            return s;
        }
    }
}";

             Dictionary<string, string> providerOptions = new Dictionary<string, string>
                {
                    {"CompilerVersion", "v3.5"}
                };
            CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);

            CompilerParameters compilerParams = new CompilerParameters
                {GenerateInMemory = true,
                 GenerateExecutable = false};

            CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, sourceCode);

            if (results.Errors.Count != 0)
                throw new Exception("Mission failed!");

            object o = results.CompiledAssembly.CreateInstance("Sample.ArrayConverter");
            MethodInfo mi = o.GetType().GetMethod("GetArray");
            return (string [,])mi.Invoke(o, null);
        }
    }
}