0

最近、このプロジェクトをASP.Net 3.5から4.0にアップグレードして、スレッドセーフ機能のためにDictionaryの代わりにconcurrentDictionaryを使用できるようにしました。

これを使用するために、ヘルプフォーラムにあるコードを使用して拡張機能を作成しました。

それはすべて動作に非常に近く、正しく動作するように拡張機能を変更する方法がわかりません。

コードは次のとおりです。

var catalogs = (from _catalog in entities.catalogs
                        from rolePermission in entities.c_roleperm
                        from _group in entities.c_group
                        from _user in entities.c_user
                        where _group.id == rolePermission.groupID
                            && rolePermission.roleID == user.roleID
                            && _catalog.groupID == rolePermission.groupID
                            && _user.id == _catalog.userID
                        select new { name = _catalog.name, groupID = _catalog.groupID, userName = _user.name, userID = _catalog.userID, groupName = _group.name, ID = _catalog.id }
                );


var listItems = catalogs.ToList(p => new CatalogItem() { name = p.name, groupID = p.groupID, userID = p.userID, username = p.userName, groupName = p.groupName, ID = p.ID }).GroupBy(p => p.groupName).ToConcurrentDictionary(p => p.Key, p => p.ToList());

そして拡張機能のコード:

public static class Extentions
{
    public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue>(
          this IEnumerable<KeyValuePair<TKey, TValue>> source)
    {
        return new ConcurrentDictionary<TKey, TValue>(source);
    }
    public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue>(
           this IEnumerable<TValue> source, Func<TValue, TKey> keySelector)
    {
        return new ConcurrentDictionary<TKey, TValue>(
            from v in source
            select new KeyValuePair<TKey, TValue>(keySelector(v), v));
    }

そして、これは私が受け取るエラーです:

エラー1メソッド'ToConcurrentDictionary'のオーバーロードは2つの引数を取りません

この状況で拡張機能を機能させるには、何を変更する必要がありますか?どんな提案でも大歓迎です。

4

3 に答える 3

2

アイテムから値を抽出できるようにするオーバーロードはありません。

public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<T, TKey, TValue>(this IEnumerable<T> source, Func<T, TKey> keySelector, Func<T, TValue> valueSelector)
{
    var pairs = source.Select(i => new KeyValuePair<TKey, TValue>(keySelector(i), valueSelector(i)));
    return new ConcurrentDictionary<TKey, TValue>(pairs);
}
于 2012-10-03T21:47:48.893 に答える
0

Func キーワードは、実際には値を返す関数に似ています。そのようなものを渡すために「式」を見ているかもしれません。これに近いもの:

public static ConcurrentDictionary<TKey, TValue> ToConcurrentDictionary<TKey, TValue>  (
    this IEnumerable<TValue> source, Expression<Func<T, bool>> keySelector)     
{         
return new ConcurrentDictionary<TKey, TValue>(
         from v in source
         select new KeyValuePair<TKey, TValue>(keySelector(v), v));     
}

コードの保証はありませんが、 MSDNのTHIS POSTExpression Classを読むことをお勧めします。

于 2012-10-03T21:54:35.540 に答える