0
votes

meilleure façon de manquer les valeurs null dans Select Linq

J'essaie d'obtenir des valeurs d'iEnumérables, j'ai besoin de modifier le retour par défaut de sélectionner et de rejeter les valeurs null.

Dans cette fonction, je travaille avec des objets xelement pour cela ". J'ai besoin que cette fonction ait la meilleure performance possible, donc pour que j'utilise SELECT (x => {} ..) code> dans mon code. P> xxx pré> Le "problème fondamental" est lorsque je crée ce code mon résultat est le suivant: p>

content: strong>
p>

0[{Last=...,Foo=...}]
1[{Last=...,Foo=...}]
2[{Last=...,Foo=...}]
3[{Last=...,Foo=...}]
4[{Last=...,Foo=...}]
5[{Last=...,Foo=...}]


1 commentaires

Si vous retirez la ligne renvoie null; , vous obtenez une erreur. Ainsi, seules les données qui sont dans si elles seront retournées. Les valeurs nulelles ne seront pas dans vous sont émises.


3 Réponses :


2
votes

Le problème fondamental est que vous utilisez Sélectionnez code> pour filtrer des éléments, lorsque où code> doit être utilisé. Puisque vous ne savez pas quels éléments pourraient être null code> avant la sélection code> appelle, il est préférable d'utiliser:

.Select(...)
.Where(x => x != null);


2 commentaires

"Le problème fondamental est que vous utilisez SELECT pour filtrer des éléments, lorsque vous devez utiliser.", C'est correct .. j'ai révisé mon code et maintenant je fais: où (condition). Sélectionnez (...) mais je ne suis pas sûr si c'est la meilleure solution. "Condition" vraiment est: Last.anyTout et j'ai besoin d'utiliser "Dernier" Var dans les deux ,.Sélectionnez et. Où.


@pikamorfo non, ce n'est pas le meilleur moyen, du tout. Il y a une raison pour laquelle j'ai mis le lieu où après la sélection



1
votes

En fait, vous n'avez pas besoin. Quoi qu'il en soit, il n'y aura qu'une seule traversée sur la collection.

pourquoi? P>

Parce que Linq expressions sont paresseuses forte>; En fait, le code suivant p> xxx pré>

ne traverse pas la matrice même une fois! P>

Chaque opérateur LINQ renvoie un ienumerable uniquement lors de l'itération de l'itération, récupérez son résultat. Sauf trois cas: p>

1) Un opérateur LINQ qui renvoie une collection spéciale ( Liste code>, un tableau) est utilisé. Par exemple, tolist () code>, toarray () code>, etc. P>

2) A foreach code> LOOP exécuté sur le résultat , alors chaque élément est récupéré lorsqu'il est demandé. p>

3) Un opérateur de comptage ou de somme est utilisé (un opérateur qui renvoie juste un résultat), par exemple, compteur () code> , moyenne () code>, aggerate () code>, etc. p>

Pour comprendre comment cela fonctionne, voyons une mise en œuvre optionnelle possible de SELECT ( ) CODE>: P>

var x = db.ToList().Where(r => r.Id < 555);
// Versus
var x = db.Where(r => r.Id < 555).ToList();


0 commentaires

1
votes

Vous pouvez vous débarrasser de null code> du tout.
Basé sur votre échantillon, où condition code> nécessite "Dernier" élément, vous pouvez le simplifier à

var result = document.Elements()
    .Select(versiones => versiones.Elements().Last())
    .Where(last => last.condition)
    .Select(last => new
    {
        Last = last,
        Foo = bar(last)
    })
    .ToList();


0 commentaires