Разделение строки в массив строк списка в C # - PullRequest
3 голосов
/ 15 октября 2019

Я пытаюсь преобразовать следующую строку:

"CN=Test,OU=ABC,OU=Company,DC=CFLA,DC=domain"

в эту форму (список строковых массивов):

[
  {"CN" , "Test"},
  {"OU" , "ABC"},
  {"OU" , "Company"},
  {"DC" , "CFLA"},
  {"DC" , "domain"},
]

Что у меня естьуже пробовал конвертировать строку в список словарей. Я попытался разделить строку дважды. Сначала на основе ,, а затем на основе =.

Ниже приведен код, который я использовал:

var result = str.Split(',')
                .Select(line => line.Split('='))
                .ToDictionary(b=> b[0], b=> b[1])
                .ToList();

Но он дает мне следующее исключение: «System.ArgumentException:« Элемент с тем же ключом уже добавлен », правильнопоскольку 'OU' и 'DC' повторяются как ключи.

Теперь мне нужно разделить / преобразовать / обработать эту строку в список строковых массивов (как показано выше). Является ли это возможным?

Или, пожалуйста, помогите мне с альтернативным решением. Заранее спасибо.

PS У меня есть сотни этих строк, и я хочу только значение первого "OU" из каждой строки.

Ответы [ 3 ]

6 голосов
/ 15 октября 2019

Если вам действительно нужен список строк- массив с, просто опустите строку "ToDictionary".

var result = str.Split(',')
            .Select(line => line.Split('='))
            .ToList();

даст вам списокМассивы, где каждый массив [0] содержит «ключ», а [1] - «значение»

ad PS: чтобы получить первое значение «OU», можно использовать регулярное выражение:

var firstOuRegex = new Regex("[oO][uU]=([^,]+)", RegexOptions.Compiled);
var testString = "CN=Test,OU=ABC,OU=Company,DC=CFLA,DC=domain";

var result = firstOuRegex.Match(testString).Groups[1];
1 голос
/ 15 октября 2019

Полагаю, что приведенный ниже код предоставит вам требуемый результат:

class Program
{
    static void Main(string[] args)
    {
        string initialString = "CN=Test,OU=ABC,OU=Company,DC=CFLA,DC=domain";

        List<string[]> finalList = new List<string[]>();
        string [] firstSplitStringsArray = initialString.Split(',');
        foreach (var item in firstSplitStringsArray)
        {
            string [] secondlySplittedStringsArray = item.Split('=');
            finalList.Add(secondlySplittedStringsArray);
        }
    }
}

Если вам нужно только первое значение OU, код может быть:

        string initialString = "CN=Test,OU=ABC,OU=Company,DC=CFLA,DC=domain";
        string requiredValue = string.Empty;

        string [] firstSplitStringsArray = initialString.Split(',');
        foreach (var item in firstSplitStringsArray)
        {
            string [] secondlySplittedStringsArray = item.Split('=');
            if (secondlySplittedStringsArray[0] == "OU")
            {
                requiredValue = secondlySplittedStringsArray[1];
                break;
            }
        }
1 голос
/ 15 октября 2019

В вашем выражении есть две записи "OU". В результате вы не можете перевести его в словарь. Вместо этого переведите его в список KeyValuePair

var result = str.Split(',')
            .Select(line => line.Split('='))
            .Select(tuple => new KeyValuePair<string, string>(tuple[0], tuple[1]))
            .ToList();
...