与字典和列表相交以返回另一个字典

时间:2019-02-21 18:23:37

标签: c# .net asp.net-core functional-programming

如何传递标题列表并获取键/值对?

我创建了一种类似于以下内容的方法:

public static IDictionary<string, string> GetHeaderValues(
    IReadOnlyList<string> keys, IHeaderDictionary headers)
{
}

我想传入诸如"trackingId, requestId, corrId"之类的字符串列表,然后像这样返回字典:

trackingId: 123123
requestId: abc123123
corrId: xyz123

此操作的目的是传递所有标头,并仅检索所需的标头。

我们如何将这两个对象IReadOnlyListIHeaderDictionarymap交叉成常规的IDictionary

我尝试将以下两者相交:

headers.Keys.Intersect(keys);,但这将返回一个无数的字符串。

2 个答案:

答案 0 :(得分:1)

您可以将键与标头连接起来,然后将结果转换成这样的字典,但是该值可能不是单个字符串。在此解决方案中,我在StringValue对象上调用了ToString(),它可能不是您想要的,但这是方法签名显示的内容:

public static IDictionary<string, string> GetHeaderValues(
    IReadOnlyList<string> keys, IHeaderDictionary headers)
{
    return headers
    .Join(keys, h => h.Key, k => k, (h, k) => h)
    .ToDictionary(h => h.Key, h => h.Value.ToString());
}

答案 1 :(得分:1)

简短的伪代码

intersect(keys1,keys2)        // get common keys list
    |> map to (key,value)     // map to key-value pair list
    |> to dictionary           // convert list to dict

C#实现:

public static IDictionary<string, string> GetHeaderValues(IReadOnlyList<string> keys, IHeaderDictionary headers)
{
    return keys.Intersect(headers.Keys)
        .Select(k => new KeyValuePair<string,string>(k,headers[k]))
        .ToDictionary(p => p.Key, p => p.Value);
}

测试用例:

var list = new List<string>{
    "Content-tyb3",  // non-exist
    "Cookie",        
    "Accept-Language",
    "Program",      // non-exist
};
var headers = GetHeaderValues(list,Request.Headers);