Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[erledigt] Frage zu DefaultIfEmpty mit First() bei IEnumerable
Siedlerchr
myCSharp.de - Member



Dabei seit:
Beiträge: 178
Herkunft: NRW

Themenstarter:

[erledigt] Frage zu DefaultIfEmpty mit First() bei IEnumerable

beantworten | zitieren | melden

Hallo zusammen,

ich habe da mal ne Frage bezüglich DefaultIfEmpty() bei einem IEnumerable im Zusammnenhang mit First()

Ich habe hier eine Methode die mir den ersten Wert einer Liste geben soll oder bei NULL einen neuen erzeugen (GetNewEmptyFreeAccount)
bei accList handelt es sich um ein List<IAccount> Objekt.


 public IAccount GetFirstActiveAccount(string hoster)
        {

            var acc = accList.Where(x => x.Hoster.Name == hoster && x.Active == true).DefaultIfEmpty(GetNewEmptyFreeAccount(hoster)).First();
            return acc;
        }

Das Problem ist jetzt, dass, obwohl etwas enthalten ist, der die Methode aus DefaultIFEmpty aufruft.
Wenn ich das richtig verstanden liegt das hieran:
Zitat von Enumerable.DefaultIfEmpty<TSource> Abschnitt Hinweise
Diese Methode wird mit verzögerter Ausführung implementiert. Der Wert der sofortigen Rückgabe ist ein Objekt, in dem alle zum Ausführen der Aktion erforderlichen Informationen gespeichert werden. Die von dieser Methode dargestellte Abfrage wird erst ausgeführt, wenn das Objekt entweder durch den direkten Aufruf der zugehörigen GetEnumerator-Methode oder mithilfe von foreach in Visual C# oder For Each in Visual Basic aufgelistet wird.

Meine Frage ist jetzt, kann ich das irgendwie umändern, sodass es funktionieren würde wie ich es mir vorstelle?
Also dass das DefaultIfEmpty die Methpode nicht jedesmal aufruft, sondern wirklich dann wenn die Collection leer ist?
Was muss ich dafür machen, habe schon überlegt aber mir ist noch kein Gedanke gekommen...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Siedlerchr am .
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 417

beantworten | zitieren | melden

Hallo,

eine Möglichkeit wäre z.b. eine separate Extension-Method:

public static class Extensions
{
	public static T FirstOrDefault<T>(this IEnumerable<T> source, Func<T, bool> predicate, Func<T> defaultFunc)
		where T : class
	{
		var result = source.FirstOrDefault(predicate);

		if (result != default(T))
			return result;

		return defaultFunc();
	}
}

public IAccount GetFirstActiveAccount(string hoster)
{
        var acc = accList.FirstOrDefault(x => x.Hoster.Name == hoster && x.Active == true, () => GetNewEmptyFreeAccount(hoster));
        return acc;
}
private Nachricht | Beiträge des Benutzers
Siedlerchr
myCSharp.de - Member



Dabei seit:
Beiträge: 178
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

Vielen vielen dank, es macht genau das was es soll.

Jetzt bin ich mir nur noch nicht ganz sicher, ob ich richtig verstanden habe wie das abläuft:

Also zuerst wird für die Elemente der Collection die erste Bedinung in der Estension Method mit dem "orgininalem" FirstOrDefault ausgewertet, ob die erfüllt ist oder nicht, dann wird ggf. die DefaultMethode aufgerufen.

Und das Func<T> ist doch letzendlich ne Art von delegate der dann auf eine Methode zeugt oder?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.865
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Siedlerchr,
Zitat
Und das Func<T> ist doch letzendlich ne Art von delegate
Es ist ein Delegate für eine Methode die keine Argument hat und als Rückgabewert T. Durch den Lambda-Ausdruck kann es auch auf eine anonyme Methode zeigen.
Unbekanntes aber bitte selber nachschlagen in der :rtfm:. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1


mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers