2009-02-09 8 views
7

je le dictionnaire suivant déclaré:Lambda « ne peut pas être déduite de l'utilisation »

private readonly Dictionary<int, Image> dictionary; 

et moi avons une méthode, ce qui provoque une erreur de compilation:

public IQueryable<Image> Find(Func<Image, bool> exp) 
    { 
     return dictionary.Single(exp); 
    } 

L'erreur que je reçois est:

Error 1 The type arguments for method 'System.Linq.Enumerable.Single<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,bool>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. C:\work\MSD-AIDS-Images\MSD-AIDS-Images-Test\TestImageRepository.cs 34 30 MSD-AIDS-Images-Test 

J'ai essayé googler autour, je ne peux pas trouver quoi que ce soit semble définitive quant à ce que je fais mal

Modifier - C'est lundi matin au travail.

je voulais mettre "où", pas simple

Edit 2!

Ok, le code est maintenant ceci:

public IQueryable<Image> Find(Func<Image, bool> exp) 
{ 
    return dictionary.Values.Where(exp); 
} 

Maintenant, j'obtiens l'erreur suivante:

Error 1 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<MSD_AIDS_Images_Data.Image>' to 'System.Linq.IQueryable<MSD_AIDS_Images_Data.Image>'. An explicit conversion exists (are you missing a cast?) C:\work\MSD-AIDS-Images\MSD-AIDS-Images-Test\TestImageRepository.cs 34 20 MSD-AIDS-Images-Test 

En tant Pour votre information, la méthode, il est pour la mise en œuvre d'une interface, la déclaration de c'est-à-dire:

IQueryable<T> Find(Func<T, bool> exp); 

Cela a été plus compliqué qu'il ne devrait l'être!

+0

Comme je l'ai déjà dit - changer le type de retour à IEnumerable

Répondre

7

Qu'est-ce que vous essayez de faire? Par exemple, Single renvoie une instance de T, pas IQueryable<T> (et pour les objets, vous devriez probablement utiliser IEnumerable<T> de toute façon) ...

Il se sent comme vous voulez:

public Image Find(Func<Image, bool> predicate) 
{ 
    return dictionary.Values.Single(predicate); 
} 

Bien sûr, vous pouvez le faire à l'échelle mondiale comme une méthode d'extension par quelque chose comme:

(modifier comprend Where de modifier la question)

static class DictionaryExtensions 
{ 
    public static TValue FindSingle<TKey, TValue>(
     this IDictionary<TKey, TValue> dictionary, 
     Func<TValue, bool> predicate) 
    { 
     return dictionary.Values.Single(predicate); 
    } 
    public static IEnumerable<TValue> Find<TKey, TValue>(
     this IDictionary<TKey, TValue> dictionary, 
     Func<TValue, bool> predicate) 
    { 
     return dictionary.Values.Where(predicate); 
    } 
} 

(Je ne suis pas sûr qu'il est beaucoup plus difficile pour l'appelant de faire eux-mêmes, bien que)

+0

Le bit de .values ​​est ce que je devais vraiment, vous obtiendrez la réponse. J'ai édité ma question pour clarifier ce que j'allais pour – qui

+0

Notez qu'avec l'endroit où vous renverriez typiquement IEnumerable etc. - heureux que vous l'ayez trié, cependant ;-p –

+0

En fait, il n'est pas trié! Plus à venir ... – qui

2

IDictionary<TKey, TValue> implémente IEnumerable<KeyValuePair<TKey,TValue>>, donc votre Func devrait ressembler plus à Func<KeyValuePair<TKey,TValue>>.

3

An explicit conversion exists (are you missing a cast?)

Il existe deux méthodes Where, l'une sur System.Linq.Enumerable (qu'il utilise), et un sur System.Linq.Queryable (que vous pensez qu'il devrait utiliser, selon ce type de retour).

Vous devez faire une des opérations suivantes:

  • Modifier le type de retour à IEnumerable<Image> - Je recommande ce!
  • changement l'appel de méthode pour Queryable.Where(dictionary.Values.AsQueryable(), exp)
  • appel AsQueryable()
+0

En effet! Je l'ai changé en IEnumerable et cela a fait l'affaire – qui

Questions connexes