La façon la plus rapide de trouver des éléments communs entre plusieurs listes en C#
Le suivant:
List<List<Option>> optionLists;
ce qui serait un moyen rapide pour déterminer le sous-ensemble de l'Option objets qui apparaissent dans toutes les listes? L'égalité est déterminée au moyen d'une chaîne de caractères de la propriété comme option1.Valeur == option2.Valeur.
Donc, nous devrions retrouver avec List<Option>
où chaque élément apparaît qu'une seule fois.
OriginalL'auteur JC. | 2008-09-03
Vous devez vous connecter pour publier un commentaire.
Ok, c'trouverez la liste de l'Option des objets qui ont une Valeur figurant dans chaque liste.
Il ne fait pas un "distinct" sélectionner vais retourner plusieurs Option objets, certains d'entre eux avec la même Valeur.
OriginalL'auteur Matt Hamilton
Bâtiment sur La réponse de Matt, puisque nous sommes seulement intéressés par les options que toutes les listes ont en commun, nous pouvons vérifier simplement les options dans la première liste que la part de l'autre:
Si une option de la liste ne peut pas contenir de dupliquer les entrées, les
Distinct
appel est inutile. Si les listes varient considérablement en taille, il serait mieux pour parcourir les options dans les plus brefs liste, plutôt que quelle que soit la liste qui arrive à êtreFirst
. Triés ou haché collections pourraient être utilisées pour améliorer la recherche de temps de laContains
appel, même si elle ne devrait pas faire beaucoup de différence pour un nombre modéré d'éléments.OriginalL'auteur Emperor XLII
Ici est beaucoup plus efficace de mise en œuvre:
Il fonctionne en créant un ensemble de tous les éléments communs à toutes les listes traitée jusqu'à présent et en comparant chaque liste de cet ensemble, la création d'un ensemble temporaire des éléments communs à la liste actuelle et la liste des éléments courants jusqu'à présent. Effectivement un O(n.m) où n est le nombre de listes et m le nombre d'éléments dans les listes.
Un exemple d'utilisation:
return current_common.Keys;
àreturn new List<T>(current_common.Keys);
et il est parfait pour mes besoins commepublic static List<T> FindCommon<T>(params List<T>[] lists)
Passons sur le fait qu'il s'avère toujours retourne le dernier de la liste, je ne pouvais pas comprendre comment utiliser ce sans
SortedDictionary
, juste régulièreDictionary
, parce que je n'ai pas les valeurs elles-mêmes à l'ordre de changement.Vous avez raison. Elle retourne le dernier de la liste, et non l'intersection de toutes les listes.
OriginalL'auteur Skizz
que sur l'utilisation d'un hashSet? de cette façon, vous pouvez faire ce que vous voulez en O(n) où n est le nombre d'éléments de toutes les listes combinées, et je pense que c'est le moyen le plus rapide de le faire.
vous suffit d'itérer sur chaque liste et insérer les valeurs que vous trouvez dans le hashset
Lorsque vous insérez une clé existe déjà, vous recevrez faux que la valeur de retour de la .ajouter une méthode, sinon vrai est retourné
OriginalL'auteur sven
De tri, puis faire quelque chose qui s'apparente à une opération de fusion-tri.
Fondamentalement, vous voulez faire cela:
OriginalL'auteur Lasse Vågsæther Karlsen
Je n'ai pas les statistiques, mais si vous ne voulez pas passer votre propre méthode, les différentes collections de bibliothèques ont un " Set " ou " Set(T)' objet de proposer l'habitude de définir des procédures. (énumérées dans l'ordre, je voudrais les utiliser).
OriginalL'auteur Anthony Mastrean
Vous pouvez le faire en comptant les occurrences de tous les éléments de toutes les listes de ces éléments dont le nombre d'événements est égal au nombre de les listes, sont communs à toutes les listes:
J'ai été tout simplement dirigé vers ce post et j'ai vérifié la méthode. Il ne fonctionne pas correctement (il renvoie les éléments qui ne font pas partie de tous les IEnumerable-s figurant dans les listes. J'ai pris la liberté de corriger cela et je vais le poster ici:
OriginalL'auteur logicnp
OriginalL'auteur user2102327
@Skizz La méthode n'est pas correcte. Elle renvoie également à des éléments qui ne sont pas communes à toutes les listes d'éléments.
Voici la méthode corrigée:
OriginalL'auteur user2102327
Après avoir cherché sur le net et pas vraiment de venir avec quelque chose que j'ai aimé (ou a travaillé), j'ai dormi sur elle et est venu avec cette. Mon
SearchResult
est similaire à votreOption
. Il a uneEmployeeId
en elle et c'est la chose que j'ai besoin d'être communs à l'ensemble des listes. Je retourne tous les enregistrements qui ont uneEmployeeId
dans chaque liste. Ce n'est pas de fantaisie, mais elle est simple et facile à comprendre, tout ce que j'aime. Pour les petites listes (mon cas), il doit effectuer très bien—et tout le monde peut le comprendre!OriginalL'auteur birdus