C#Linq从ToDictionary获得不正确的结果

时间:2018-11-04 23:47:42

标签: c#

我有一些代码,寻找匹配项,已回答的问题here给出了该问题的一些历史记录。我正在查看数据集,对数据进行排序和查找。

我的例子:

print(df_pivot)
value        H1  H10  H11  H15   H2  H21        H4   H5   H6   H7   H9
Date                                                                  
2018-01-01  4.5  3.0  NaN  4.0  2.5  5.0  2.666667  NaN  4.0  NaN  3.5
2018-02-01  NaN  NaN  4.0  NaN  NaN  NaN       NaN  2.0  NaN  5.0  NaN

print(df_pivot.corr())
value  H1  H10  H11  H15  H2  H21  H4  H5  H6  H7  H9
value                                                
H1    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H10   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H11   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H15   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H2    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H21   NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H4    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H5    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H6    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H7    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN
H9    NaN  NaN  NaN  NaN NaN  NaN NaN NaN NaN NaN NaN

我得到:

// Test Data:
ConcurrentBag<string> One = new ConcurrentBag<string>() { "0", "1", "3", "5", "7", "9" };
ConcurrentBag<string> Two = new ConcurrentBag<string>() { "0", "2", "4", "6", "8", "10" };
ConcurrentBag<string> Three = new ConcurrentBag<string>() { "0", "10", "20", "30", "40" };

// Init new Index:
BaseCollection = new ConcurrentDictionary<int, ConcurrentBag<string>>();
BaseCollection[0] = One;
BaseCollection[1] = Two;
BaseCollection[2] = Three;

// Get all Id's in this Collection:
var IDs = BaseCollection.SelectMany(u => u.Value);

// Sort and extract Matches:
var Matches = IDs.GroupBy(id => id)
                 .Where(id => id.Count() > 1)
                 .Select(id => id.Key).Distinct()
                 .ToDictionary(id => id.ToString(), id => id.Count());

我应该得到:

0: 1
10: 2

我做错了什么?

1 个答案:

答案 0 :(得分:5)

这里的idstring

.ToDictionary(id => id.ToString(), id => id.Count());

因此,它不像您认为的那样代表集合。呼叫计数返回字符数,而不是出现某项的次数。

您应该将LINQ查询更改为使用实际组而不是密钥:

IDs.GroupBy(id => id)
   .Where(id => id.Count() > 1)
   .ToDictionary(g => g.Key, g => g.Count());