explained c# ienumerable

explained - ienumerator c#



¿Cómo puedo devolver un IEnumerable vacío? (5)

Dado el siguiente código y las sugerencias dadas en esta pregunta , he decidido modificar este método original y preguntar si hay algún valor en el IEnumarable devolverlo, si no devolver un IEnumerable sin valores.

Aquí está el método:

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 }); }

Ya que todo está dentro de la declaración de devolución, no sé cómo podría hacer esto. Algo como esto funcionaría?

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>(); } }

El método anterior no funciona, y de hecho no debe hacerlo; Solo siento que ilustra mis intenciones. Creo que debo especificar que el código no funciona porque no se puede crear una instancia de una clase abstracta.

Aquí está el código de llamada, no quiero que reciba un IEnumerable nulo en ningún momento:

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; } }

Gracias por tu tiempo.


Creo que la forma más sencilla sería

return new Friend[0];

Los requisitos de la devolución son simplemente que el método devuelve un objeto que implementa IEnumerable<Friend> . El hecho de que en diferentes circunstancias devuelva dos tipos diferentes de objetos es irrelevante, siempre y cuando ambos implementen IEnumerable.


En cuanto a mí, la forma más elegante es la yield break



Por supuesto, eso es solo una cuestión de preferencia personal, pero escribiría esta función utilizando el rendimiento:

public IEnumerable<Friend> FindFriends() { //Many thanks to Rex-M for his help with this one. //http://.com/users/67/rex-m if (userExists) { foreach(var user in doc.Descendants("user")) { yield return new Friend { ID = user.Element("id").Value, Name = user.Element("name").Value, URL = user.Element("url").Value, Photo = user.Element("photo").Value } } } }


Puedes usar la list ?? Enumerable.Empty<Friend>() list ?? Enumerable.Empty<Friend>() , o FindFriends que FindFriends devuelva Enumerable.Empty<Friend>()