C # – Recherche des membres communs de deux listes s – Syntaxe Lambda

J’ai donc écrit cette application console simple pour m’aider à poser ma question. Quelle est la bonne façon d’utiliser une expression lambda sur la ligne 3 de la méthode pour obtenir les membres communs. Essayé une jointure (), mais ne pouvait pas trouver la syntaxe correcte. En guise de suivi … existe-t-il un moyen non-LINQ de faire cela en une ligne que j’ai raté?

class Program { static void Main(ssortingng[] args) { List c = new List() { 1, 2, 3 }; List a = new List() { 5, 3, 2, 4 }; IEnumerable j = c.Union(a); // just show me the Count Console.Write(j.ToList().Count.ToSsortingng()); } } 

Vous voulez Intersect() :

 IEnumerable j = c.Intersect(a); 

Voici un exemple OrderedIntersect() basé sur les idées mentionnées dans les commentaires. Si vous savez que vos séquences sont ordonnées, elles devraient courir plus vite – O(n) plutôt que ce que .Intersect() est normalement (ne vous souvenez pas de moi). Mais si vous ne savez pas qu’ils sont commandés, les résultats ne seront probablement pas corrects du tout:

 public static IEnumerable OrderedIntersect(this IEnumerable source, IEnumerable other) where T : IComparable { using (var xe = source.GetEnumerator()) using (var ye = other.GetEnumerator()) { while (xe.MoveNext()) { while (ye.MoveNext() && ye.Current.CompareTo(xe.Current) < 0 ) { // do nothing - all we care here is that we advanced the y enumerator } if (ye.Current.Equals(xe.Current)) yield return xe.Current; else { // y is now > x, so get x caught up again while (xe.MoveNext() && xe.Current.CompareTo(ye.Current) < 0 ) { } // again: just advance, do do anything if (xe.Current.Equals(ye.Current)) yield return xe.Current; } } } } 

Si vous utilisez la syntaxe lambda comme une vraie requête LINQ, cela ressemble à ceci:

 IEnumerable j = from cItem in c join aitem in a on cItem equals aItem select aItem; 

Une expression lambda est quand vous utilisez l’opérateur =>, comme dans:

 IEnumerable x = a.Select(y => y > 5); 

Ce que vous avez avec la méthode Union est vraiment une façon de le faire non-LINQ, mais je suppose que vous voulez dire un moyen de le faire sans méthodes d’extension. Il n’ya guère de solution unique pour cela. J’ai fait quelque chose de similaire en utilisant un dictionnaire hier. Vous pourriez faire comme ça:

 Dictaionary match = new Dictaionary(); foreach (int i in c) match.Add(i, false); foreach (int i in a) { if (match.ContainsKey(i)) { match[i] = true; } } List result = new List(); foreach (KeyValuePair pair in match) { if (pair.Value) result.Add(pair.Key); }