158 votes

Vérifier si la liste<t> contient un élément d'une autre liste

J'ai une liste de paramètres comme celle-ci :

public class parameter
{
    public string name {get; set;}
    public string paramtype {get; set;}
    public string source {get; set;}
}

IEnumerable<Parameter> parameters;

Et un tableau de chaînes de caractères que je veux vérifier.

string[] myStrings = new string[] { "one", "two"};

Je veux itérer sur la liste des paramètres et vérifier si la propriété source est égale à l'un des tableaux myStrings. Je peux le faire avec des foreach's imbriqués mais j'aimerais apprendre à le faire d'une manière plus élégante car j'ai joué avec linq et j'aime les méthodes d'extension sur les énumérables comme where etc. Je ne sais pas s'il y a une façon plus élégante de le faire avec linq/lambda/delegete.

Remerciements

340voto

BrokenGlass Points 91618

Vous pouvez utiliser un Any() pour ce contrôle qui est disponible sur n'importe quel Enumerable :

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));

Une exécution plus rapide sur des collections plus importantes consisterait à projeter parameters à source et utiliser ensuite Intersect qui utilise en interne un HashSet<T> Ainsi, au lieu de O(n^2) pour la première approche (l'équivalent de deux boucles imbriquées), vous pouvez effectuer la vérification en O(n) :

bool hasMatch = parameters.Select(x => x.source)
                          .Intersect(myStrings)
                          .Any(); 

Par ailleurs, vous devriez mettre des majuscules à vos noms de classes et de propriétés pour vous conformer aux directives de style C#.

12voto

Masoud Darvishian Points 910

Voici un exemple permettant de déterminer s'il existe des éléments correspondants dans une autre liste

List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 };
List<int> nums2 = new List<int> { 1, 3, 6, 9, 12};

if (nums1.Any(x => nums2.Any(y => y == x)))
{
    Console.WriteLine("There are equal elements");
}
else
{
    Console.WriteLine("No Match Found!");
}

7voto

mammadkoma Points 309
list1.Select(l1 => l1.Id).Intersect(list2.Select(l2 => l2.Id)).ToList();

var list1 = await _service1.GetAll();
var list2 = await _service2.GetAll();

// Create a list of Ids from list1
var list1_Ids = list1.Select(l => l.Id).ToList();

// filter list2 according to list1 Ids
var list2 = list2.Where(l => list1_Ids.Contains(l.Id)).ToList();

6voto

Umang Agarwal Points 21

Si les deux listes sont trop grandes et que nous utilisons l'expression lamda, la recherche prendra beaucoup de temps. Il est préférable d'utiliser linq dans ce cas pour récupérer la liste des paramètres :

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X