Angesichts des folgenden Codes und der in dieser Frage gegebenen Vorschläge habe ich beschlossen, diese ursprüngliche Methode zu ändern und zu fragen, ob Werte in IEnumarable vorhanden sind. Geben Sie sie zurück, wenn nicht, geben Sie eine IEnumerable ohne Werte zurück.
Hier ist die Methode:
public IEnumerable<Friend> FindFriends()
{
//Many thanks to Rex-M for his help with this one.
//https://stackoverflow.com/users/67/rex-m
return doc.Descendants("user").Select(user => new Friend
{
ID = user.Element("id").Value,
Name = user.Element("name").Value,
URL = user.Element("url").Value,
Photo = user.Element("photo").Value
});
}
Da sich alles in der return-Anweisung befindet, weiß ich nicht, wie ich das tun könnte. Würde so etwas funktionieren?
public IEnumerable<Friend> FindFriends()
{
//Many thanks to Rex-M for his help with this one.
//https://stackoverflow.com/users/67/rex-m
if (userExists)
{
return doc.Descendants("user").Select(user => new Friend
{
ID = user.Element("id").Value,
Name = user.Element("name").Value,
URL = user.Element("url").Value,
Photo = user.Element("photo").Value
});
}
else
{
return new IEnumerable<Friend>();
}
}
Die obige Methode funktioniert nicht und sollte es auch nicht. Ich fühle nur, dass es meine Absichten veranschaulicht. Ich denke, ich sollte angeben, dass der Code nicht funktioniert, da Sie keine Instanz einer abstrakten Klasse erstellen können.
Hier ist der aufrufende Code, ich möchte nicht, dass er zu irgendeinem Zeitpunkt eine Null-IEnumerable erhält:
private void SetUserFriends(IEnumerable<Friend> list)
{
int x = 40;
int y = 3;
foreach (Friend friend in list)
{
FriendControl control = new FriendControl();
control.ID = friend.ID;
control.URL = friend.URL;
control.SetID(friend.ID);
control.SetName(friend.Name);
control.SetImage(friend.Photo);
control.Location = new Point(x, y);
panel2.Controls.Add(control);
y = y + control.Height + 4;
}
}
Vielen Dank für Ihre Zeit.
quelle
Antworten:
Sie können verwenden
list ?? Enumerable.Empty<Friend>()
oderFindFriends
zurückgebenEnumerable.Empty<Friend>()
quelle
new List<Friend>()
da es gegossen wird,IEnumerable<Friend>
wenn es von dieser Methode zurückgegeben wird?new List<Friend>()
ist eine teurere Operation, weil sie eine Instanz einer Liste erstellen würde (und dabei Speicher dafür zuweisen würde)Du könntest zurückkehren
Enumerable.Empty<T>()
.quelle
Für mich ist der eleganteste Weg
yield break
quelle
public IEnumerable<Friend> FindFriends() { if(!userExists) yield break; foreach(var descendant in doc.Descendants("user").Select(user => new Friend { ID = user.Element("id").Value, Name = user.Element("name").Value, URL = user.Element("url").Value, Photo = user.Element("photo").Value })) { yield return descendant; } }
Das ist natürlich nur eine Frage der persönlichen Präferenz, aber ich würde diese Funktion mit Yield Return schreiben:
quelle
Ich denke, der einfachste Weg wäre
Die Anforderungen der Rückgabe sind lediglich, dass die Methode ein Objekt zurückgibt, das implementiert wird
IEnumerable<Friend>
. Die Tatsache, dass Sie unter verschiedenen Umständen zwei verschiedene Arten von Objekten zurückgeben, ist irrelevant, solange beide IEnumerable implementieren.quelle
quelle