1

Dictionary<string, CachedImage>アイテムをグループ化し、グループ内のアイテムの数をカウントし、カウントが 6500 を超える場合は各グループを反復処理したい があります。

このCachedImageクラスには、私が興味を持っているPathAndプロパティが含まれています。ExpiresUtc

私の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();
4

1 に答える 1

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化しCachedImageます。Valueプロパティを使用したことに注意してください。Matchメソッドはオブジェクトを返すMatchため、一致の実際のテキストでグループ化するのが最適です。このステップの結果はのになりIEnumerableます<IGrouping<string, KeyValuePair<string, CachedImage>>>

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

これにより、6500を超えるアイテムを持つグループのみが取得されます。

于 2013-03-13T01:46:35.670 に答える