ci-dessous est un code de test LINQPAD. Lorsque cela exécute les erreurs informatiques, la deuxième instance de "élément" a une liste nulle de subitems par opposition à une liste vide.
Je veux traiter les deux situations (null ou vide) exactement de la même manière que je me suis demandé si je me demandais si Il y avait une manière plus propre que de simplement mettre une vérification nulle sur la liste et initialiser une liste vide lorsqu'il y a une null. p>
En d'autres termes, je pourrais le faire: P>
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();
}
4 Réponses :
from si in (i.subitems ?? new List<item>()) how about that?
oui, c'est mieux que le mien (et je me frappe pour ne pas faire cela en premier lieu) mais cela signifie toujours créer un objet simplement pour l'éliminer qui se sent mal
@captncraig pour d'autres utilisations de ??, voir Stackoverflow.com/Questtions/1689530/how-utilisateur-is-cs-operato r / ...
Vous pouvez ajouter une méthode d'extension (mal) pour faire le travail pour vous
public static IEnumerable<T> EnsureNotEmpty<T>(this IEnumerable<T> enumerable) {
if ( enumerable == null ) {
return Enumerable.Empty<T>();
} else {
return enumerable;
}
}
Est énumérable.repeat énumérable.empty
@bdukes, énumérable.empty est meilleur car il est plus déclaratif de votre intention. Pour une raison quelconque, je continue à oublier que c'est une partie du cadre et de répéter (0) à la place.
La méthode doit être appelée ensurenotnull (...) code>. Parce que ensurenoPty (...) code> semble comme s'il ajouterait un élément délibéré. : ->
Pourquoi dites-vous que c'est mal? J'aime beaucoup cette approche.
Vous pouvez utiliser le Opérateur de coalescence null
var res = myItemList.Where(x => x.subitems != null)
.SelectMany(
x => x.subitems.Select(
y => new { x.itemname, subitemname = y.itemname }
)
);
En fait, cette deuxième option est très lisible et ne signifie pas qu'une nouvelle liste doit être créée uniquement pour être ignorée. Merci
@Chris Simpson: J'ai ajouté la version Lambda depuis que vous l'avez demandé. La version de la syntaxe de la requête est bien plus lisible.
Je pense vraiment que la clause où est la solution la plus propre ici, donc je marquais cela comme la réponse. J'étais juste curieux de l'équivalent Lambda, mais je suis d'accord, ce n'est pas aussi lisible. Merci.
Une méthode supplémentaire ne serait pas de permettre aux subitems d'être nuls. Vous pouvez faire le constructeur de l'article afin qu'il soit par défaut sous -igez -em dans une liste vide, puis n'autorise pas NULL dans le Setter Subitem. P>
Cela suppose bien sûr que vous avez accès à Modifier l'élément. P>
L'opérateur coalescent null est ce que vous recherchez comme indiqué par Hunter Daley P>