c#`dictionary of dictionary`查询

c#`dictionary of dictionary`查询,c#,C#,有人能告诉我正确的查询方法吗: dictionary of dictionary Dictionary<int, Dictionary<Guid, AutoStopWatchAndLog>> _dicDictionaryThread 如果要投影到筛选到所需项的新字典,则需要投影两个级别的字典,如下所示: var query = _dicDictionaryThread.Select(o => new {o.Key, Value = o.Value

有人能告诉我正确的查询方法吗:

dictionary of dictionary

Dictionary<int, Dictionary<Guid, AutoStopWatchAndLog>> _dicDictionaryThread

如果要投影到筛选到所需项的新字典,则需要投影两个级别的字典,如下所示:

var query = _dicDictionaryThread.Select(o => new {o.Key, Value = o.Value
                                                                  .Where(y=>y.Value.Level > x)
                                                                  .ToDictionary(y => y.Key, y => y.Value)})
                                .Where(o => o.Value.Any())
                                .ToDictionary(o => o.Key, o => o.Value);

如果你能很容易地理解这一点并向其他人解释,那就去做吧,否则就使用传统的循环-你不会从Linq中获得任何性能提升,而且破译可能需要更长的时间。

你希望输出的结构是什么?上层的int和下层的
Guid
?是否要输出级别本身?你为什么要调用
FirstOrDefault
?@DStanley你说得很对是的ID和GUID可以。。。但我认为它只会过滤匹配的集合,所以最终将是一个INT级别的集合和一个GUID级别的集合。但林克的表现不是更差吗?人们使用它是因为它更容易理解,而不是相反。@jdmdevdotnet性能差异通常可以忽略不计。对性能的影响来自迭代器、过滤器和委托的额外开销,但通常很小,总体上不会产生显著的影响。不过,在这种情况下,我不会说它更“可读”。一个带有适当注释的循环将更容易遵循IMHO。同意不同意;)
var query = _dicDictionaryThread.Select(o => new {o.Key, Value = o.Value
                                                                  .Where(y=>y.Value.Level > x)
                                                                  .ToDictionary(y => y.Key, y => y.Value)})
                                .Where(o => o.Value.Any())
                                .ToDictionary(o => o.Key, o => o.Value);