首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建泛型扩展方法?

如何创建泛型扩展方法?
EN

Stack Overflow用户
提问于 2009-12-01 20:39:36
回答 6查看 96.8K关注 0票数 78

我想开发一个通用的扩展方法,它应该按字母顺序排列字符串,然后按纵向升序排列。

我是说

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

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

开发泛型扩展方法的方法是什么?

我试过了:

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

我收到了:

错误1: t不包含长度定义

错误2:无法将System.Linq.IOrderedEnumerable转换为T[]

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-01 20:43:37

第一个错误是因为LengthString类的属性,而在您的泛型版本中,T参数的类型是未知的。它可以是任何类型。

第二个错误是因为您只返回query对象,而不返回实际结果。在返回之前,您可能需要调用ToArray()

只需稍加修改,您就可以得出以下结果:

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);
    }
}

您可以像这样使用它:

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

Stack Overflow用户

发布于 2009-12-01 20:46:01

为什么要泛泛地这么做呢?只需使用

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

Stack Overflow用户

发布于 2009-12-01 20:57:39

我想你可能对泛型的目的有点迷惑。

泛型是一种将类或方法定制为特定类型的方法。泛型方法或类被设计为适用于任何类型。这在List<T>类中是最容易说明的,在该类中可以将其裁剪为任何类型的列表。这为您提供了类型安全性,因为您知道列表只包含该特定类型。

您的问题是针对特定类型设计的,即string类型。泛型不会解决涉及特定类型的问题。

您需要的是一个简单的(非泛型)扩展方法:

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);
    }
}

将参数和返回类型设为IEnumerable<string>使其成为可应用于实现IEnumerable<string>的任何类型的非泛型扩展方法。这将包括string[]List<string>ICollection<string>IQueryable<string>等。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1825952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档