如何创建通用扩展方法?

use*_*675 63 c# generics

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

我的意思是

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

var query = names.OrderBy(a => a.Length).ThenBy(a => a);
Run Code Online (Sandbox Code Playgroud)

开发通用扩展方法的方法是什么?

我试过了 :

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

我收到了 :

错误1:T不包含Length的定义

错误2:无法转换System.Linq.IOrderedEnumerableT[].

Dar*_*rov 96

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

第二个错误是因为您只返回查询对象而不是实际结果.您可能需要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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以这样使用:

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


Max*_*erl 14

你为什么要这样做呢?只是用

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

  • 为什么`string []`而不是`IEnumerable <String>`?您可以删除`.ToArray()`并将其延迟(如果我没有记错的话). (3认同)
  • 这忽略了这个问题并提出了一个完全不同问题的解决方案 (3认同)

Pau*_*ner 7

我想你可能会对泛型的目的感到困惑.

泛型是一种为特定类型定制类或方法的方法.通用方法或类旨在适用于任何类型.这在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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