65 votes

Méthode d'extension générique C #

Je veux développer une méthode d'extension générique qui devrait organiser la chaîne en ordre alphabétique puis en ordre croissant dans le sens de la longueur.

je veux dire

 string[] names = { "Jon", "Marc", "Joel",
                  "Thomas", "Copsey","Konrad","Andrew","Brian","Bill"};

var query = names.OrderBy(a => a.Length).ThenBy(a => a);
 

Je suis nouveau aux génériques. Quelle est la manière de développer la méthode d'extension générique?

J'ai essayé :

 public static class ExtensionOperation
    {
        public static T[] AlphaLengthWise<T>(this T[] names)
        {
            var query = names.OrderBy(a => a.Length).ThenBy(a => a);
            return query;
        }
    }
 

J'ai reçu :

Erreur 1: T ne contient pas de définition pour la longueur

Erreur 2: impossible de convertir System.Linq.IOrderedEnumerable en T [].

97voto

Darin Dimitrov Points 528142

La première erreur est parce qu' Length est une propriété de l' String classe alors que dans votre version générique du type de paramètre T n'est pas connue. Il pourrait être n'importe quel type.

La deuxième erreur est parce que vous revenir juste l'objet de requête, mais pas le résultat réel. Vous pourriez avoir besoin d'appeler ToArray() avant de revenir.

Avec peu de modifications que vous pourriez en venir à ceci:

public static class ExtensionOperation
{
    public static IEnumerable<T> AlphaLengthWise<T, L>(
        this IEnumerable<T> names, Func<T, L> lengthProvider)
    {
        return names
            .OrderBy(a => lengthProvider(a))
            .ThenBy(a => a);
    }
}

Que vous pourriez utiliser comme ceci:

string[] names = { "Jon", "Marc", "Joel", "Thomas", "Copsey", "Konrad", "Andrew", "Brian", "Bill" };
var result = names. AlphaLengthWise(a => a.Length);

14voto

Maximilian Mayerl Points 6335

Pourquoi voulez-vous faire cela génériquement? Juste utiliser

 public static class ExtensionOperations
{
    public static IEnumerable<string> AlphaLengthWise(this string[] names)
    {
        var query = names.OrderBy(a => a.Length).ThenBy(a => a);
        return query;
    }
}
 

7voto

Tragedian Points 12308

Je pense que vous pourriez être un peu confus à la fin des génériques.

Les génériques sont un moyen d'adapter une classe ou d'une méthode à un type spécifique. Une méthode générique ou de la classe est conçu pour tout type. Ce qui est le plus facilement illustré dans l' List<T> classe, où il peut être adapté pour être une liste de tout type. Cela vous donne le type de la sécurité de savoir que la liste ne contient que type spécifique.

Votre problème est conçu pour fonctionner sur un type spécifique, l' string type. Les génériques ne sont pas à résoudre un problème qui implique un type spécifique.

Ce que vous voulez, c'est un simple (non générique) Méthode d'Extension:

public static class ExtensionOperations
{
    public static IEnumerable<string> AlphaLengthWise(
        this IEnumerable<string> names)
    {
        if(names == null)
            throw new ArgumentNullException("names");

        return names.OrderBy(a => a.Length).ThenBy(a => a);
    }
}

Faire de l'argument et le type de retour IEnumerable<string> , en fait un non-générique de la méthode d'extension qui peut s'appliquer à n'importe quel type de mise en œuvre IEnumerable<string>. Cela comprendra string[], List<string>, ICollection<string>, IQueryable<string> et beaucoup plus.

4voto

Henk Holterman Points 153608

Pourquoi voulez-vous qu'il soit générique?

Cela ne fonctionnera que lorsque T aura une propriété Length et vous aurez besoin d'une interface pour l'appliquer.

De plus, T doit être IComparable.

2voto

Alex Bagnolini Points 7403

Je veux développer une méthode d'extension générique qui devrait organiser les chaînes en ordre alphabétique puis ...

 public static class ExtensionOperation
{
    public static IEnumerable<String> AplhaLengthWise(
                                   this IEnumerable<String> names)
    {
        return names.OrderBy(a => a.Length).ThenBy(a => a);
    }
}
 

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