【问题标题】:Flatten a KeyValuePair<string, List<string>> object using linq [duplicate]使用 linq 展平 KeyValuePair<string, List<string>> 对象 [重复]
【发布时间】:2017-06-26 19:03:19
【问题描述】:

所以,基本上我是在 C# 中实现一个 MultiMap,并且我采用了显而易见的方法:使用一个使用 List 作为值的 Dictionary 对象。接下来,我需要返回一个扁平化的键值对列表:List&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;。使用循环来做这件事还不错,但我很好奇如何用 Linq 完成这件事。

我使用 SelectMany 函数接近了,但我不太清楚如何从 A 点到达 B 点。这是我在没有 Linq 的情况下完成的代码(减去您不关心的其他位)。

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。

【问题讨论】:

  • 扁平化 == LINQ SelectMany
  • 你在 LINQ 中尝试过什么吗?关于在 SO 上使用 LINQ 有很多问题...
  • 叹息,有多少人没有阅读整个问题,这并不让我感到惊讶。我在第二段中提到了 SelectMany 函数。

标签: c# linq dictionary


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多