Посмотрите, что это поможет вам, когда я выбираю опыт = Да, мой диалог, id которого является dlg3, является popup.and, если значение No, оно не откроется
Я бы написал так:
private Dictionary<string, string> ParsePathParameters(string path)
{
return GetSegmentPairs().ToDictionary(x => x.k, x => x.v);
IEnumerable<(string k, string v)> GetSegmentPairs()
{
var segments = path?.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries)
?? new string[0];
for (int i = 0, l = segments.Length; i < l; i += 2)
yield return (segments[i+0], segments[i+1]);
}
}
Не стоит недооценивать силу локальных функций и генераторов. Генераторы хороши, когда вам нужно создавать последовательности, которые неудобно писать как прямой запрос linq. Затем эти генераторы могут быть использованы в запросах linq. В этом конкретном случае это может даже не потребоваться для довольно тривиального запроса, но для более сложных запросов это неоценимо. Но это шаблон, который вы должны научиться использовать чаще.
Если бы я использовал C # 8, я бы привык использовать span / memory и слайсы, где это уместно.
private Dictionary<string, string> ParsePathParameters(string path)
{
return GetSegments().ToDictionary(x => x.Span[0], x => x.Span[1]);
IEnumerable<System.Memory<string>> GetSegments()
{
var segments = path?.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries) ?? new string[0];
for (int i = 0, l = segments.Length; i < l; i += 2)
yield return segments[^i..i+1];
}
}
В противном случае, если вы используете MoreLINQ, вы можете использовать методы Pairwise()
и TakeEvery()
, чтобы эффективно сделать то же самое, что и метод GetSegmentPairs()
выше.
private Dictionary<string, string> ParsePathParameters(string path) =>
(path?.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries)
?? Enumerable.Empty<string>())
.Pairwise(ValueTuple.Create)
.TakeEvery(2) // pairwise produces overlapping pairs so take every other
.ToDictionary(x => x[0], x => x[1]);