web-dev-qa-db-fra.com

Vérifier si la liste <t> contient une autre liste

J'ai une liste de paramètres comme ceci:

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 que je veux vérifier.

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

Je veux parcourir la liste de paramètres et vérifier si la propriété source est égale à l'un des tableaux myStrings. Je peux le faire avec des foreachs imbriqués, mais j'aimerais apprendre à le faire de manière plus agréable, car je me suis amusé avec linq et j'aime les méthodes d'extension sur énumérable, comme où etc. Existe-t-il un moyen plus élégant de choisir linq/lambda/delegete?.

Merci

70
gdp

Vous pouvez utiliser une Any() imbriquée pour cette vérification 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 sur source, puis à utiliser Intersect, qui utilise en interne un HashSet<T> donc au lieu de O (n ^ 2) pour la première approche (l’équivalent de deux boucles imbriquées), vous pouvez effectuer l’enregistrement O(n):

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

En tant que commentaire parallèle, vous devez également utiliser les noms de classe et de propriété pour qu'ils soient conformes aux instructions de style C #.

152
BrokenGlass

Voici un exemple pour savoir s’il existe des éléments de correspondance 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!");
}
0
Masoud Darvishian

Si la liste est trop longue et que nous utilisons l'expression lambda, la recherche prendra beaucoup de temps. Mieux vaut 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();
0
Umang Agarwal