2013-03-13 70 views
1

我有一個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(); 
+2

我會使用'.Where(c => c.Value.Count()> 6500)'在group by之後對列表進行預過濾。 – Romoku 2013-03-13 01:39:34

回答

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) 

組列表通過對CachedImagePath的正則表達式匹配。請注意,我已經使用了Value屬性 - Match方法返回一個Match對象,所以最好按照匹配的實際文本進行分組。此步驟的結果將是IEnumerable<IGrouping<string, KeyValuePair<string, CachedImage>>>

.Where(g => g.Count() > 6500); 

這確保只有那些具有> 6500項目的組才能被檢索。

+0

乾杯!這看起來有希望。如果我也想檢查到期日是否會是這樣的? (g => g.Count()> MaxFilesCount || g.Select(a => a.Value.ExpiresUtc 0); ' – 2013-03-13 11:15:42

+1

@JamesSouth是的,這看起來是正確的。在這種情況下,您將檢索一個大於'MaxFilesCount'成員的組,或者其中一個或多個成員的'ExpiresUtc'值小於指定的'DateTime'的組。如果這聽起來正確,你應該很好去。 – 2013-03-13 19:51:25

+0

謝謝!非常感激! – 2013-03-13 19:55:16