221 votes

Comment faire pour convertir les résultats linq HashSet ou HashedSet

J’ai une propriété sur une classe qui est un ISet. J’essaie d’obtenir les résultats d’une requête linq dans cette propriété, mais ne peut pas trouver un moyen de le faire.

Fondamentalement, vous cherchez la dernière partie de ceci :

Pourrait également faire ceci :

Edit : C’est ce que j’ai fini par faire :

328voto

Jon Skeet Points 692016

Je ne pense que il n'y a rien construit dans lequel n'est présente... mais il est très facile d'écrire une méthode d'extension:

public static class Extensions
{
    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
    {
        return new HashSet<T>(source);
    }
}

Notez que vous n'avez vraiment une extension de la méthode (ou au moins une méthode générique d'une certaine forme) ici, parce que vous ne pouvez pas être en mesure d'exprimer le type d' T explicitement:

var query = from i in Enumerable.Range(0, 10)
            select new { i, j = i + 1 };
var resultSet = query.ToHashSet();

Vous ne pouvez pas faire cela avec un appel explicite à l' HashSet<T> constructeur. Nous sommes en s'appuyant sur l'inférence de type pour les méthodes génériques pour le faire pour nous.

Maintenant, vous pourriez choisir un nom ToSet et retour ISet<T> - mais je collerais avec ToHashSet et le type de béton. Cela est conforme à la norme des opérateurs LINQ (ToDictionary, ToList) et permet l'agrandissement (par exemple, ToSortedSet). Vous pouvez également fournir une surcharge en précisant la comparaison à utiliser.

86voto

Joel Mueller Points 14985

Juste passer votre IEnumerable dans le constructeur pour HashSet.

20voto

Matthew Abbott Points 32861

Comme @Joel a déclaré, vous pouvez juste passer votre énumérables dans. Si vous voulez faire une méthode d’extension, vous pouvez faire :

3voto

Rune FS Points 13350

C’est assez simple  :)

et oui T est le type spécifié par OP  :)

2voto

Jamie Points 786

Réponse de Jon est parfait. Le seul inconvénient est que, à l’aide HashedSet de NHibernate, j’ai besoin de convertir les résultats à une collection. Y a-t-il une manière optimale de procéder ?

ou

Ou ai-je raté quelque chose d’autre ?

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