9
votes

Mélanger tout () et premier () à Linq?

première im un noob à Linq! Ensuite, la chose est que j'ai une collection qui:

  1. soit ne contient pas mon identifiant (String) LI>
  2. ou contient seulement une fois li> ol>

    Je voulais utiliser où mais je n'aime pas le si code> instructions que je dois faire ... Voici mon code: P>

    if (MyCollection.Any(rm => rm.BaseName == rbName))
    {
        var tmp = MyCollection.First(rm => rm.BaseName == rbName);
    }
    


3 commentaires

Vous devriez vérifier firstordfault


Pourquoi n'utilisez-vous pas FirstOrdefault () et après la requête que vous vérifiez si votre résultat est NULL ou contient vos données?


Je ne connaissais pas cette méthode :( Je préfère Simordefault quand même!


7 Réponses :


16
votes

Entité non unique Réponse forte> (avec exception lance sur plusieurs instances)

Utilisez SingleFault . Cela retournera l'élément unique s'il existe, null si elle n'existe pas ou si elle jettera et excepte s'il y en a plus d'un. P> xxx pré>

propriété unique Réponse forte> (il n'y aura jamais de plusieurs instances) p>

Si votre système est configuré de sorte que basename code> est une entité unique, utilisateur sRevarefault code> , cela ne jettera pas une exception s'il y a plusieurs car cela s'arrêtera à la première instance, mais le système sera conçu de manière à ce qu'il n'y aura jamais le même exemple, il serait donc acceptable (et la réduction du temps). P >

var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);


2 commentaires

C'est vraiment sympa! La manipulation des exceptions est très gentille :)


C'est bien de manière à ce que s'il y ait jamais une correspondance, il lancera une exception, mais si votre système est configuré qu'il n'est pas possible pour un duplicata, l'exception ne sera jamais requise puis aller avec FirstArdefault (uniquement si c'est un primaire. clé ou a défini la validation lors de l'insertion).



5
votes
var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName));
Here tmp will be null if you don't have such record.

0 commentaires

1
votes

Utiliser sReveArdefault (rm => rm.basename == rbname);

lien MSDN


0 commentaires

1
votes

tout code> renvoie bool code> Pour indique si ces éléments sont existants, premier code> renvoie l'enregistrement de votre collection. Donc, dans tout cas, vous aurez un objet de la collecte et du résultat de votre condition. Vous pouvez utiliser sridreDefault code>, puis vérifier "code> null code> votre valeur renvoyée.

var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);
if (tmp != null) 
{
    // do something
}


0 commentaires

2
votes

Vous pouvez utiliser, xxx

ou xxx


0 commentaires

1
votes
var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);
if (tmp != null)
{
    // Do something
}

0 commentaires

12
votes

Comme le dit lapuissance, vous devez utiliser SingleEfault code> ou peut-être FirstArdefault code> . S'il n'y a vraiment qu'une telle entrée, ils feront la même chose, mais FirstArdefault CODE> peut bien être plus rapide si vous utilisez LINQ vers des objets - SingleEfault code> devrait numériser à travers la séquence complète pour vérifier qu'il n'y a pas d'autres correspondances.

S'il y a plusieurs correspondances, SingleFault code> lancera une exception; firstordefault code> retournera simplement la première correspondance. p>

afin que vous puissiez utiliser: p>

var result = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName);
if (result != null)
{
    // Use it
}


1 commentaires

Bon point Jon. C'est délicat de voir s'il s'agissait d'un élément clé principal ou défini de manière unique, une grande addition néanmoins.