Разделить строку «Переменная пути» в словаре в С#

Я хочу разорвать строку:

value1/672/value2/32/value3/21413

В

Dictionary<string, string>

Как я могу это сделать без использования цикла for?

Поскольку некоторые значения представляют ключи, а некоторые значения представляют значения, может потребоваться цикл. Конечно, я не вижу здесь проблемы с использованием цикла. Есть ли конкретная причина, по которой вы хотите избежать цикла for?

Jonathan Wood 06.07.2024 19:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Предполагая, что предоставленная строка содержит первое значение в качестве ключа, а второе — значение в предоставленной строке.

value1/672/value2/32/value3/21413

Вот как вы можете достичь вышеперечисленного:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        string input = "value1/672/value2/32/value3/21413";
        string[] parts = input.Split('/');
        var dictionary = parts
            .Select((value, index) => new { value, index })
            .Where(x => x.index % 2 == 0) // Select only even indexed elements as keys
            .ToDictionary(x => x.value, x => parts[x.index + 1]); // Use the next element as value      
        
        foreach (var kvp in dictionary)   // Loop for printing the result only
        {
            Console.WriteLine($"{kvp.Key}: {kvp.Value}");   // Output the dictionary key and values
        }
    }
}

См. рабочий .netfiddle здесь

Если вы действительно этого хотите, вы можете сделать это с помощью пары операторов LINQ, но я не вижу в этом большой добавленной стоимости:

var str = "value1/672/value2/32/value3/21413";

// Array containing [value1, 672, value2, 32, value3, 21413
var arr = str.Split('/');

arr
    // Zip gives you pairs between 2 collections, here i'm zipping arr with itself with first element skipped
    // this gives both the key => value but also the value=> key pairs
    // so this results in {value1, 672} which we want, but also in {672, value2} which we do not want
    .Zip(arr.Skip(1))
    // Keep only the even indexes to get rid of the pairs we don't want mentioned above
    .Where((item, index) => index % 2 == 0)
    // Convert those tuples to a dictionary
    .ToDictionary(item => item.First, item => item.Second);

Я попробовал и ваше решение, и решение SELA. В вашем решении ошибка возникает с помощью .Zip(), который ожидает два параметра.

Ulisses Farias 06.07.2024 19:48

@UlissesFarias, возможно, вы используете более старую версию .net, которая не имеет этой перегрузки, я скопировал/вставил сюда код после тестирования его в linqpad, на какую версию .net вы ориентируетесь?

Ronan Thibaudau 06.07.2024 20:16

Версия 4.0.

Ulisses Farias 06.07.2024 20:33

@UlissesFarias, я бы рекомендовал добавить этот тег при задании вопроса, поскольку версия 4.0 устарела, поэтому вы можете получить неправильные ответы, если предположить, что это последние версии (.net 4.0 выпущен 14 лет назад).

Ronan Thibaudau 06.07.2024 20:36

должен работать с использованием .Zip(arr.Skip(1),(First,Second)=> new {First,Second}) вместо .net 4.0

Ronan Thibaudau 06.07.2024 20:39

Чтобы добавить еще один подход, здесь также будет работать простой шаблон регулярного выражения:

просто используйте шаблон ([^/]+)/([^/]+), который использует:

  • (...) - группа захвата
  • [^/]+ - соответствует одному или нескольким (оператор +) символам, отличным от / (инвертированный класс символов [^/]

Это будет соответствовать «парам» значений, разделенных /.

Вот пример кода C#:

var values = Regex
    .Matches(
        "value1/672/value2/32/value3/21413",
        "([^/]+)/([^/]+)")
    .ToDictionary(x => x.Groups[1], x => x.Groups[2]);

Другие вопросы по теме