我想开发一个通用扩展方法,它应该按字母顺序排列字符串,然后按纵向升序排列.
我的意思是
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不包含Length的定义
错误2:无法转换
System.Linq.IOrderedEnumerable为T[].
Dar*_*rov 96
第一个错误是因为Length是String类的属性,而在通用版本中,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);
    }
}
您可以这样使用:
string[] names = { "Jon", "Marc", "Joel", "Thomas", "Copsey", "Konrad", "Andrew", "Brian", "Bill" };
var result = names.AlphaLengthWise(a => a.Length);
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;
    }
}
我想你可能会对泛型的目的感到困惑.
泛型是一种为特定类型定制类或方法的方法.通用方法或类旨在适用于任何类型.这在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>等等.
| 归档时间: | 
 | 
| 查看次数: | 75960 次 | 
| 最近记录: |