1
votes

Utilisation de linq pour trouver l'une des valeurs multiples de List >

Ma liste ressemble à: List> .

Je dois vérifier si l'une des premières valeurs de la liste imbriquée est égale à certaines valeurs.

C'est ce que j'ai fait et ça marche:

if (myList.Any(sb => 
               sb.First() == "Value1" || 
               sb.First() == "Value2" || 
               sb.First() == "Value3" || 
               sb.First() == "Value4"))

Je me demandais s'il y avait un moyen de faire la requête de manière à ne pas répéter le sb. Premier () ? Ma manière de mettre en œuvre a-t-elle une influence sur les performances?


2 commentaires

Créez un tableau de toutes les valeurs possibles, c'est-à-dire var array = new [] {"Value1", "Value2", "Value3", "Value4"} , puis vérifiez if (myList.Any ( sb => array.Contains (sb.First ())) ?


Si maListe est de type IList , il appellera simplement sb [0] == "Value1" , etc.


4 Réponses :


1
votes

Vous pouvez d'abord créer un HashSet pour contenir les valeurs:

if (myList.Any(sb => container.Contains(sb.First()))){...}

, puis l'utiliser comme:

var container = new HashSet<string> {"Value1", "Value2", "Value3", "Value4"};


0 commentaires

1
votes

Vous pouvez avoir un tableau de valeurs et vérifier s'il contient tout ce qui se trouve dans sb.First () , comme ceci:

if (myList.Any(sb => 
           new HashSet<string> {"Value1", "Value2", "Value3", "Value4"}.IndexOf(sb.First()) > -1)


3 commentaires

Que diriez-vous: nouvelle chaîne [] -> HashSet ?


Ouais, un jeu de hachage pourrait être mieux.


Si vous envisagez d'utiliser un ensemble de hachage, vous feriez mieux d'accepter l'une des réponses qui le suggèrent au lieu de ma suggestion pour un tableau ...



1
votes
var matches = new HashSet<string>() { "Value1", "Value2", "Value3", "Value4" };

myList.Select(sb => sb.FirstOrDefault()).
       Any(st => matches.Contains(st));
Should do it, using a HashSet to improve string comparisons.

0 commentaires

1
votes

Vous pouvez également faire ceci:

        if (l.Any(x =>
        {
            var sb = x.First();
            return sb == "Value1" ||
                   sb == "Value2" ||
                   sb == "Value3" ||
                   sb == "Value4";
        }))
        {
            // true
        }


0 commentaires