Есть ли способ переписать этот запрос, чтобы он был более «LINQ-ier»?

Посмотрите, что это поможет вам, когда я выбираю опыт = Да, мой диалог, id которого является dlg3, является popup.and, если значение No, оно не откроется

1
задан Ian Kemp 4 March 2019 в 06:00
поделиться

1 ответ

Я бы написал так:

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]);
0
ответ дан Jeff Mercado 4 March 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: