Laden...

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

Erstellt von Siedlerchr vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.233 Views
S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 12 Jahren
[erledigt] Frage zu DefaultIfEmpty mit First() bei IEnumerable

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 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...

S
417 Beiträge seit 2008
vor 12 Jahren

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;
}
S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 12 Jahren

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?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Siedlerchr,

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!"