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
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 #.
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!");
}
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();