C# 如何格式化复杂的linq表达式?

C# 如何格式化复杂的linq表达式?,c#,.net,linq,C#,.net,Linq,我有一种怪物linq表情: public static class HeaderOperators { public static IDictionary<string, string> GetValues(IReadOnlyList<string> keys, IHeaderDictionary headers, string defaultValue) { return keys.Select(x => x.ToLower()).

我有一种怪物
linq
表情:

public static class HeaderOperators
{
    public static IDictionary<string, string> GetValues(IReadOnlyList<string> keys, IHeaderDictionary headers, string defaultValue)
    {
        return keys.Select(x => x.ToLower()).Intersect(headers.Keys.Select(x => x.ToLower()))
            .Select(k => new KeyValuePair<string, string>(k.ToLower(), headers[k.ToLower()]))
            .Union(keys.Select(x => x.ToLower()).Where(k => !headers.Keys.Select(x => x.ToLower()).Contains(k.ToLower())).Select(k => new KeyValuePair<string, string>(k.ToLower(), defaultValue)))
            .ToDictionary(p => p.Key.ToLower(), p => p.Value);
    }
}
公共静态类头操作符
{
公共静态IDictionary GetValues(IReadOnlyList键、IHeaderDictionary头、字符串defaultValue)
{
返回keys.Select(x=>x.ToLower()).Intersect(headers.keys.Select(x=>x.ToLower()))
.Select(k=>newkeyvaluepair(k.ToLower(),headers[k.ToLower()]))
.Union(keys.Select(x=>x.ToLower()).Where(k=>!headers.keys.Select(x=>x.ToLower()).Contains(k.ToLower()).Select(k=>newkeyvaluepair(k.ToLower(),defaultValue)))
.ToDictionary(p=>p.Key.ToLower(),p=>p.Value);
}
}
有没有工具可以很好地格式化此文件,使其可读?


或者,也许有一种更易于管理的语法?

我会将其拆分为更具可读性的语法:

public static class HeaderOperators
{
    public static IDictionary<string, string> GetValues(IReadOnlyList<string> keys, IHeaderDictionary headers, string defaultValue)
    {
        var firstCollection = keys
            .Select(x => x.ToLower()).Intersect(headers.Keys.Select(x => x.ToLower()))
            .Select(k => new KeyValuePair<string, string>(k.ToLower(), headers[k.ToLower()]));

        var secondCollection = keys
            .Select(x => x.ToLower())
            .Where(k => !headers.Keys.Select(x => x.ToLower()).Contains(k.ToLower()))
            .Select(k => new KeyValuePair<string, string>(k.ToLower(), defaultValue));

        return
            firstCollection.Union(secondCollection).ToDictionary(p => p.Key.ToLower(), p => p.Value);
    }
}
公共静态类头操作符
{
公共静态IDictionary GetValues(IReadOnlyList键、IHeaderDictionary头、字符串defaultValue)
{
var firstCollection=keys
.Select(x=>x.ToLower()).Intersect(headers.Keys.Select(x=>x.ToLower()))
.Select(k=>newkeyvaluepair(k.ToLower(),headers[k.ToLower()]);
var secondCollection=keys
.Select(x=>x.ToLower())
.Where(k=>!headers.Keys.Select(x=>x.ToLower()).Contains(k.ToLower())
.Select(k=>newkeyvaluepair(k.ToLower(),defaultValue));
回来
firstCollection.Union(secondCollection.ToDictionary)(p=>p.Key.ToLower(),p=>p.Value);
}
}

由于它是链式的,而不是嵌套式的,所以我将其格式化如下:

return keys.Select( x => x.ToLower() )
           .Intersect( headers.Keys.Select(x => x.ToLower()) )
           .Select( k => new KeyValuePair<string, string>(k.ToLower(), headers[k.ToLower()]) )
           .Union( keys.Select(x => x.ToLower() )
           .Where( k => !headers.Keys.Select(x => x.ToLower()).Contains(k.ToLower()) )
           .Select( k => new KeyValuePair<string, string>(k.ToLower(), defaultValue)) )
           .ToDictionary( p => p.Key.ToLower(), p => p.Value );
返回键。选择(x=>x.ToLower())
.Intersect(headers.Keys.Select(x=>x.ToLower())
.Select(k=>newkeyvaluepair(k.ToLower(),headers[k.ToLower()]))
.Union(键.Select(x=>x.ToLower())
.Where(k=>!headers.Keys.Select(x=>x.ToLower()).Contains(k.ToLower())
.Select(k=>newkeyvaluepair(k.ToLower(),defaultValue)))
.ToDictionary(p=>p.Key.ToLower(),p=>p.Value);

而且。。。在每行末尾添加注释。

非常好的方法,但是,您是否会像我一样倾向于另一个答案?为什么?