Преобразовать строку в строку [,] в c # - PullRequest
2 голосов
/ 21 июня 2011

У меня есть строка с данными следующим образом. как мне присвоить его строке [,]?

Строка при передаче имеет значение, как показано ниже:

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 ]

1 голос
/ 21 июня 2011

Вам нужно будет создать свой собственный анализатор для работы с этим форматом данных, который у вас есть. Предполагая, что формат этой строки всегда будет { "A1", "A2", ... }, { "B1", "B2", ... } ... и , здесь нет экранированных символов (то есть вы не ожидаете } или " в пределах ваших подстрок), а затем код на самом деле довольно просто.

В качестве отправной точки вы можете использовать это описание алгоритма. Он не оптимизирован и немного неаккуратен в том, как он анализирует (например, допускает 0 или более запятых / пробельных символов) - это всего лишь отправная точка.

  • (A) Ешьте пробелы и запятые, пока не увидите первый {.
    • Выделите новый string[].
    • (B) Ешьте пробелы и запятые, пока не увидите первый " или }.
      • Если видно ", считывайте символы в буфер до тех пор, пока " не появится снова; сохраните этот буфер в виде строки в текущем массиве, при необходимости изменив размер. Повторяйте цикл с шага (B).
      • Если замечено }, и вы еще не выделили многомерный массив, сделайте это сейчас, используя длину этого массива в качестве второго измерения; в противном случае просто сохраните его в массиве, изменив размер при необходимости. Повторяйте цикл с шага (A).

Если в какой-то момент вы достигнете конца ввода, вы должны выйти из цикла и вернуть свой массив.

0 голосов
/ 21 июня 2011

Я написал сумасшедшее, но работоспособное решение. Давайте компилятор сделает это работает ...:)

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);
        }
    }
}
0 голосов
/ 21 июня 2011

Это может помочь с первым шагом (при условии, что строка отформатирована последовательно):

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

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

Затем вы можете разбить каждый сегмент на запятую.

0 голосов
/ 21 июня 2011

Если вы предоставляете эту строку в коде, вам нужно переформатировать ее, чтобы она была двумерной (например, новая строка [,] {{"a", "b"}, {"c", "d"}}).Если вы получаете эту строку из какого-то другого источника, вам нужно сначала проанализировать ее.Вы берете строку и говорите ей преобразовать ее в массив строк 2-й строки, что невозможно, поскольку вы предоставляете только одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...