Lambda

2009-02-09 5 views
7

Ich habe folgendes Wörterbuch erklärt „nicht aus der Nutzung geschlossen werden“Lambda

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

Der Fehler, den ich bekommen ist:

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 

ich versucht habe googeln um, ich kann nicht alles endgültig als scheinen, zu finden, was ich falsch mache

Bearbeiten - Dies ist Montag Morgen bei der Arbeit.

ich meinte, "where" zu setzen, nicht einzelne

Edit 2!

Ok, ist der Code jetzt das:

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

Jetzt bekomme ich folgende Fehlermeldung:

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 

Als FYI, wobei das Verfahren es zur Implementierung einer Schnittstelle ist, die Erklärung für das ist:

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

Das hat komplizierter als es sein sollte!

+0

Wie ich bereits gesagt - die zu IEnumerable Rückgabetyp

Antwort

7

Was versuchen Sie zu tun? Zum Beispiel wird Single eine Instanz von T zurückzukehren, kein IQueryable<T> (und für Objekte, sollten Sie wahrscheinlich IEnumerable<T> sowieso verwenden) ...

Es ist wie Sie fühlt sich wünschen:

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

Natürlich ( umfasst Where von Frage bearbeiten bearbeiten)

: Sie könnte wie über etwas das weltweit als eine Erweiterungsmethode tun
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); 
    } 
} 

(Ich bin nicht sicher, dass es viel schwieriger für den Anrufer dies selbst zu tun, obwohl)

+0

Das Bit .values ​​ändern ist, was ich wirklich benötigt wird, so dass Sie die Antwort. Ich habe meine Frage bearbeitet, um zu klären, was ich für – qui

+0

Beachten Sie, dass mit wo würden Sie normalerweise IEnumerable usw. zurückgeben - froh, dass Sie es sortiert haben, obwohl; - p –

+0

Eigentlich ist es nicht sortiert! Mehr dazu ... – qui

2

IDictionary<TKey, TValue> implementiert IEnumerable<KeyValuePair<TKey,TValue>>, so dass Ihre Func sollte eher wie Func<KeyValuePair<TKey,TValue>> aussehen.

3

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

Es gibt zwei Where Methoden, eine auf System.Linq.Enumerable (die es verwendet) und ein auf System.Linq.Queryable (von denen Sie denken, dass es nach diesem Rückgabetyp verwenden sollte).

Sie benötigen einen der folgenden Schritte zu tun:

  • Änderung der Rückgabetyp IEnumerable<Image> - ich dies empfehlen!
  • Änderung der Methodenaufruf zu Queryable.Where(dictionary.Values.AsQueryable(), exp)
  • Anruf AsQueryable()
+0

In der Tat! Ich änderte es zu IEnumerable und das machte den Trick – qui