Я хочу разорвать строку:
value1/672/value2/32/value3/21413
В
Dictionary<string, string>
Как я могу это сделать без использования цикла for?
Предполагая, что предоставленная строка содержит первое значение в качестве ключа, а второе — значение в предоставленной строке.
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(), который ожидает два параметра.
@UlissesFarias, возможно, вы используете более старую версию .net, которая не имеет этой перегрузки, я скопировал/вставил сюда код после тестирования его в linqpad, на какую версию .net вы ориентируетесь?
Версия 4.0.
@UlissesFarias, я бы рекомендовал добавить этот тег при задании вопроса, поскольку версия 4.0 устарела, поэтому вы можете получить неправильные ответы, если предположить, что это последние версии (.net 4.0 выпущен 14 лет назад).
должен работать с использованием .Zip(arr.Skip(1),(First,Second)=> new {First,Second}) вместо .net 4.0
Чтобы добавить еще один подход, здесь также будет работать простой шаблон регулярного выражения:
просто используйте шаблон ([^/]+)/([^/]+)
, который использует:
(...)
- группа захвата[^/]+
- соответствует одному или нескольким (оператор +
) символам, отличным от /
(инвертированный класс символов [^/]
Это будет соответствовать «парам» значений, разделенных /
.
Вот пример кода C#:
var values = Regex
.Matches(
"value1/672/value2/32/value3/21413",
"([^/]+)/([^/]+)")
.ToDictionary(x => x.Groups[1], x => x.Groups[2]);
Поскольку некоторые значения представляют ключи, а некоторые значения представляют значения, может потребоваться цикл. Конечно, я не вижу здесь проблемы с использованием цикла. Есть ли конкретная причина, по которой вы хотите избежать цикла for?