Poniżej znajduje się kod testowy linqpad. Gdy uruchamia to błędy, ponieważ druga instancja "elementu" ma zerową listę podelementów w przeciwieństwie do pustej listy.Jak traktować puste listy, takie jak puste listy w linq?
Chciałbym traktować obie sytuacje (pusty lub pusty list) w dokładnie taki sam sposób, ale zastanawiałem się, czy był lepszy sposób niż tylko umieszczenie zerowej kontroli na liście i zainicjowanie pustej listy, gdy jest pusta.
innymi słowy, mogę to zrobić:
from si in (i.subitems == null ? new List<item>() : i.subitems)
ale to trochę brzydki i zastanawiałem się jak mogę poprawić na to?
public class item
{
public string itemname { get; set; }
public List<item> subitems { get; set; }
}
void Main()
{
List<item> myItemList = new List<item>()
{
new item
{
itemname = "item1",
subitems = new List<item>()
{
new item { itemname = "subitem1" },
new item { itemname = "subitem2" }
}
},
new item
{
itemname = "item2"
}
};
myItemList.Dump();
var res = (from i in myItemList
from si in i.subitems
select new {i.itemname, subitemname = si.itemname}).ToList();
res.Dump();
}
jako pytanie dodatkowe, czy to samo zapytanie linq może być przedstawione jako lambda i traktować wartości zerowe w ten sam sposób?
Cheers Chris
w rzeczywistości ta druga opcja jest bardzo czytelna i nie oznacza, że nowa lista musi zostać stworzona tylko po to, aby ją zignorować. dzięki –
@ Chris Simpson: Dodałem wersję lambda, ponieważ poprosiłeś o nią.Wersja składni zapytań jest o wiele bardziej czytelna. – jason
Naprawdę uważam, że klauzula where jest najczystszym rozwiązaniem, dlatego zaznaczam to jako odpowiedź. Ciekawi mnie tylko odpowiednik lambda, ale zgadzam się, to nie jest tak czytelne. Dzięki. –