2011-06-21 87 views
2

我有一个字符串与数据如下。我如何将它分配给一个字符串[,]?将字符串转换为字符串[,]在C#

传递时,该字符串具有象下面的值:

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

同样在文本Visualiser的观察时如下:

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

我无法分配串来串[,]

string [,] strArray = test; 

这是抛出错误不能字符串转换为字符串[,]

+2

什么是输入字符串的来源? – Gabe

回答

0

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

1

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

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

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

如果在某些时候,你到达输入的结尾,你应该退出循环,并返回你的阵列。

0

这可以与第一步骤的帮助(假设字符串一致的格式):

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

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

然后,可以通过拆分逗号空间中的每个段。

+0

这只是假设,没有任何可能性,即'{'或'}'字符将在输入带引号的字符串内出现下工作。 – Gabe

+0

这就是为什么我加了一个警告“假设字符串格式一致”,希望暗示你说的是什么。 –

+0

您会惊讶于有多少人没有意识到逗号可以出现在CSV行的数据中,或者引号可以在SQL字符串中显示。我不明白“格式一致”意味着字符串中没有括号。 – Gabe

0

我已经写了crazzy但可行的解决方案。让我们的编译器做它的工作... :)

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