Dengan kode berikut dan saran yang diberikan dalam pertanyaan ini , saya telah memutuskan untuk memodifikasi metode asli ini dan bertanya apakah ada nilai dalam IEnumarable mengembalikannya, jika tidak mengembalikan IEnumerable tanpa nilai.
Inilah metodenya:
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
});
}
Karena semuanya ada di dalam pernyataan kembali, saya tidak tahu bagaimana saya bisa melakukan ini. Apakah sesuatu seperti ini berfungsi?
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>();
}
}
Metode di atas tidak bekerja, dan sebenarnya itu tidak seharusnya; Saya hanya merasa itu menggambarkan niat saya. Saya merasa saya harus menentukan bahwa kode tidak berfungsi karena Anda tidak dapat membuat turunan dari kelas abstrak.
Ini adalah kode panggilan, saya tidak ingin menerima IEnumerable nol kapan saja:
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;
}
}
Terima kasih atas waktu Anda.
c#
ienumerable
Sergio Tapia
sumber
sumber
Jawaban:
Anda dapat menggunakan
list ?? Enumerable.Empty<Friend>()
, atauFindFriends
kembaliEnumerable.Empty<Friend>()
sumber
new List<Friend>()
karena itu akan dilemparkan keIEnumerable<Friend>
ketika kembali dari metode itu?new List<Friend>()
adalah operasi yang lebih mahal karena akan membuat turunan dari daftar (dan mengalokasikan memori untuknya dalam proses)Kamu bisa kembali
Enumerable.Empty<T>()
.sumber
Bagi saya, cara yang paling elegan adalah
yield break
sumber
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; } }
Itu tentu saja hanya masalah preferensi pribadi, tapi saya akan menulis fungsi ini menggunakan imbal hasil:
sumber
Saya pikir cara paling sederhana adalah
Persyaratan pengembalian hanyalah bahwa metode mengembalikan objek yang mengimplementasikan
IEnumerable<Friend>
. Fakta bahwa dalam keadaan yang berbeda Anda mengembalikan dua jenis objek tidak relevan, selama keduanya mengimplementasikan IEnumerable.sumber
sumber