2016-06-15 12 views
0

Ich versuche, eine Methode eines Objekts in einem Lambda-Ausdruck aufzurufen und dann die Liste zu ordnen. Ist es möglich, dies in einem Ausdruck zu tun?C# -Aufruffunktion des Objekts in Lambda und orderby

das, was ich jetzt habe, ist, funktioniert es:

// FindItemsResults<Item> is of namespace Microsoft.Exchange.WebServices.Data.FindItemsResults<Item> 
FindItemsResults<Item> findResults = service.FindItems(
     WellKnownFolderName.Inbox, 
     view 
    ); 


foreach (Item myItem in findResults.Items.Where(o => LoadObject(o) == true).OrderByDescending(o => o.DateTimeCreated)) 
{ 
// Do that stuff again... 
}    


private static bool LoadObject(Item o) 
{ 
    o.Load(); 
    return true; 
} 

Was ich frage mich, ob es einen Weg, dies zu LoadObject ohne den Anruf zu tun ist, die o.Load zu tun in der Lage, innerhalb des Lambda-Ausdrucks. Es ist eine Void-Methode, also wird es gegen einen Boolean nicht funktionieren.

Vielen Dank für Ihre Eingabe.

Mit freundlichen Grüßen.

+6

Sie sollten das wirklich nicht tun. LINQ ist für die Abfrage von Daten gedacht und sollte keine Nebenwirkungen haben. Ich schlage vor, Sie laden die Elemente über eine normale Schleife und führen dann Ihre Abfrage durch. –

Antwort

0

Ja, Sie können dies tun.

Zum Beispiel können Sie die Erweiterungsmethode erstellen:

public static class Extensions 
{ 
    public static IEnumerable<Item> Load(this IEnumerable<Item> items) 
    { 
     foreach(var item in items) 
     { 
      item.Load() 

      yield return item; 
     } 
    } 
} 

und es dann gerne nennen:

foreach (var item in findResults.Items.Load().OrderByDescending(o => o.DateTimeCreated)) 
{ 
    // Do some stuff... 
} 

Aber ich würde sagen, dass Sie Load Methode direkt in Ihrem Schleife aufrufen können.

+0

Natürlich würde eine Erweiterungsmethode ausreichen, danke dafür! Ich könnte den item.Load innerhalb der Schleife aufrufen, aber dann wäre ich nicht in der Lage, nach DateTime zu ordnen, weil Felder geladen werden müssen. – Nicklorion

+0

Ich sehe. Dann wird die Erweiterungsmethode tun, was Sie brauchen. Oder du musst zuerst deine Sachen durchgehen und 'load' aufrufen. – MaKCbIMKo

+0

Ja, es ist ein wenig peinlich, dass Exchange die Item-Ergebnisse als entladene Ergebnisse liefert. Ich weiß nicht, warum das so ist. Die Erweiterungsmethode ist jetzt implementiert und funktioniert wie ein Zauber! Danke @MaKCbIMKo – Nicklorion

0

Die Erweiterungsmethode Where erwartet einen Delegaten, der einen booleschen Wert zurückgibt. Sie können keine VOID angeben. Yacoub Massad war in seinem Kommentar korrekt, dass ein LINQ-Query-Ausdruck keine Nebenwirkungen auf die zugrunde liegenden Daten haben sollte. Wenn Sie die foreach-Schleife entfernen möchten, weil Sie glauben, dass sauberer Code erstellt wird, können Sie List(of T).ForEach verwenden, um eine Aktion für jedes Element auszuführen, und dann in der nächsten Zeile die Elemente abfragen und bestellen. Zum Beispiel:

findResults.Items.ToList().ForEach(o => o.Load(o)); 

foreach (var item in FindResults.Items.OrderByDescending(o => o.DateTimeCreated)) 
{ 
    // Do stuff 
} 
0

Es ist nicht immer ein gute Praxis von einer reinen funktionalen Programmierung Sicht betrachtet, aber ich definiere die beiden Erweiterungsmethoden folgen:

public static void ForEach<T>(
    this IEnumerable<T> pEnumerable, 
    Action<T> pAction 
) { 
    foreach (var item in pEnumerable) 
     pAction(item); 
} 

public static IEnumerable<T> ForEachWithContinue<T>(
    this IEnumerable<T> pEnumerable, 
    Action<T> pAction 
) { 
    pEnumerable.ForEach(pAction); 
    return pEnumerable; 
} 

Und dann können Sie folgendes tun:

findResults 
.Items 
.ForEachWithContinue(o => o.Load()) 
.OrderByDescending(o => o.DateTimeCreated) 
.ForEach(o => { 
    // do more stuff 
}); 
+0

Vielen Dank für Ihre Eingabe, irgendwie habe ich es bei der Beantwortung in den Kommentaren von MaKCbIMKo verpasst – Nicklorion

Verwandte Themen