分组和计数字典项

时间:2013-03-13 01:29:10

标签: c# linq

我有一个Dictionary<string, CachedImage>我想要对项目进行分组,计算组中的项目数,如果计数大于6500,则遍历每个组。

CachedImage类包含我感兴趣的PathExpiresUtc属性。

我的Linq-fu遗憾地缺乏复杂的查询,所以这就是我所拥有的,我想我已经搞砸了。我假设我想要的是可能的。

任何帮助都会受到赞赏,特别是快速演练。

Regex searchTerm = new Regex(@"(jpeg|png|bmp|gif)");
var groups= PersistantDictionary.Instance.ToList()
            .GroupBy(x => searchTerm.Match(x.Value.Path))
            .Select(y => new
                           {
                            Path = y.Key,
                            Expires = y.Select(z => z.Value.ExpiresUtc),
                            Count = y.Sum(z => z.Key.Count())
                           })
            .AsEnumerable();

1 个答案:

答案 0 :(得分:2)

试试这个:

var groups = PersistantDictionary.Instance.ToList()
        .GroupBy(x => searchTerm.Match(x.Value.Path).Value)
        .Where(g => g.Count() > 6500);

foreach (var group in groups)
{
    Console.WriteLine("{0} images for extension {1}", group.Count(), group.Key);

    foreach (KeyValuePair<string, CachedImage> pair in group)
    {
        //Do stuff with each CachedImage.
    }
}

所以要打破这个:

PersistantDictionary.Instance.ToList()

生成KeyValuePair<string, CachedImage>

的列表
.GroupBy(x => searchTerm.Match(x.Value.Path).Value)

按正则表达式匹配对Path的{​​{1}}对列表进行分组。请注意,我使用了CachedImage属性 - Value方法返回Match对象,因此最好按匹配的实际文本进行分组。此步骤的结果将是Match的{​​{1}}。

IEnumerable

这确保只有那些具有&gt;的组。将检索6500个项目。