展平KeyValuePair <string,list <string =“”>&gt;使用linq的对象

时间:2017-06-26 19:03:20

标签: c# linq dictionary

所以,基本上我在C#中实现了MultiMap,并采用了明显的方法:使用一个使用List作为值的Dictionary对象。接下来,我需要返回一个扁平的键值对列表:List<KeyValuePair<TKey, TValue>>。使用循环来做它并不是那么糟糕,但我很好奇如何使用Linq完成这项工作。

我接近使用SelectMany功能,但我无法弄清楚如何从A点到达B点。这是我的代码,它没有Linq(除了你不喜欢的其他位) #39; t关心)。

public class MultiDict<TKey, TValue>
{
    private Dictionary<TKey, List<TValue>> _dict = new Dictionary<TKey, List<TValue>>();

    public void AddValue(TKey key, TValue val)
    {
        List<TValue> list;
        if (_dict.ContainsKey(key))
        {
            list = _dict[key];
        }
        else
        {
            list = new List<TValue>();
            _dict.Add(key, list);
        }
        list.add(val);
    }

    public KeyValuePair<TKey, TValue>[] Flattened() 
    {
        var flattened = new List<KeyValuePair<TKey, TValue>>();
        foreach (var pair in _dict)
        {
            //pair.Value is actually a List<TValue> object that we have to
            //    iterate through as well
            foreach (var val in pair.Value)
            {
                flattened.add(new KeyValuePair<TKey, TValue>(pair.Key, val));
            }
        }

        return flattened.ToArray();
    }
}

所以,如果我这样使用它:

var multiDict = new MultiDict<int, string>();
multiDict.Add(1, "King");
multiDict.Add(1, "Boomy");
multiDict.Add(3, "Aang");

var results = multiDict.Flattened();

我应该在results中获得三个KeyValuePairs。

1 个答案:

答案 0 :(得分:1)

select many会使嵌套数组变平。 Value.Select为子列表中的每个项创建一个KVP,select many然后将嵌套数组转换为flatten集合。

public KeyValuePair<TKey, TValue>[] Flattened()
{
    return _dict.SelectMany(x => x.Value.Select(v => new KeyValuePair<TKey, TValue>(x.Key, v))).ToArray();
}