组合密钥匹配的多个字典

时间:2017-02-08 08:39:03

标签: c# linq dictionary grouping

我得到了

<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/navigation"/>

来自应用程序的不同部分。这可以返回一些词典,这就是我将它们存储在列表中的原因:

Dictionary<DateTime,double>() 

我想将DateTime键相等的字典组合在一起,并将结果转换为数组对象[,],以便每行看起来像这样:

var masterlist = new List<Dictionary<DateTime, double>>();

其中d1,d2,...,dn是列表中字典的模拟代码。 我该怎么办呢?

4 个答案:

答案 0 :(得分:4)

你可以试试这个:

    Dictionary<DateTime, double[]> preResult = masterlist.SelectMany(s => s).GroupBy(k => k.Key)
        .ToDictionary(k => k.Key, v => v.Select(s => s.Value).ToArray());

   var result = preResult.Select(s =>
    {
        var res = new List<object>(); 

        res.Add(s.Key);
        res.AddRange(s.Value.Cast<object>());

        return res.ToArray(); 

    }).ToArray();

答案 1 :(得分:2)

以下是@ Ksv3n的类似解决方案,其中结果是DateTime作为键的字典,而双重列表作为值:

Dictionary<DateTime, List<double>> masterDic = masterlist 
    .SelectMany(dic => dic)
    .GroupBy(dic => dic.Key)
    .ToDictionary(dic => dic.Key, values => values.Select(v => v.Value).ToList());

答案 2 :(得分:0)

您可以使用var masterlist = new List<Dictionary<DateTime, double>>(); Dictionary<DateTime, List<double>> dtDoubles = new Dictionary<DateTime, List<double>>(); foreach (var item in masterlist) { foreach (var kvPair in item) { if (!dtDoubles.ContainsKey(kvPair.Key)) { dtDoubles.Add(kvPair.Key, new List<double> {kvPair.Value}); } else { dtDoubles[kvPair.Key].Add(kvPair.Value); } } } 。您循环通过您拥有的词典列表并将条目添加到此词典中。

JSONParser parser = new JSONParser();

Object obj = parser.parse(new FileReader(
        "sample.json"));

JSONArray jsonArray = (JSONArray) obj;
for (int i = 0; i < jsonArray.size(); i++) {
    System.out.println("Before --" + jsonArray.get(i).toString());
    JSONObject jsonObject = (JSONObject)jsonArray.get(i);
    jsonObject.remove("selected");
    System.out.println("After --" + jsonArray.get(i).toString());
}
System.out.println("Final Output --" + jsonArray.toString());

答案 3 :(得分:0)

这个怎么样:

        Dictionary<DateTime, List<double>> result =
        masterlist.Select(x => x.AsEnumerable())
            .Aggregate((a, b) => a.Concat(b))
            .GroupBy(x => x.Key)
            .ToDictionary(k => k.Key, v => v.Select(x => x.Value).ToList());