如何创建一个通用的扩展方法? [英] How to create a generic extension method?

查看:110
本文介绍了如何创建一个通用的扩展方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我的意思是

 的String [] =名称{乔恩,马克,乔尔
                  托马斯,科普塞,康拉德,安德鲁,布莱恩,条例};变种查询= names.OrderBy(一个= GT;则为a.length).ThenBy(一个=>一种);

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

我试过:

 公共静态类ExtensionOperation
    {
        公共静态T [] AlphaLengthWise< T>(这件T []的名称)
        {
            变种查询= names.OrderBy(一个= GT;则为a.length).ThenBy(一个=>一种);
            返回查询;
        }
    }

我收到了:


  

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


  
  

错误2:不能转换 System.Linq.IOrderedEnumerable T []



解决方案

第一个错误是因为长度字符串<的属性/ code>类,而在通用版t参数的类型是不知道。它可以是任何类型的

第二个错误是因为你只返回查询对象但没有实际结果。您可能需要 ToArray的()在返回之前调用。

使用小的修改,你可以想出这样的:

 公共静态类ExtensionOperation
{
    公共静态的IEnumerable&LT; T&GT; AlphaLengthWise&LT; T,L&GT;(
        这IEnumerable的&LT; T&GT;名,Func键&LT; T,L&GT; lengthProvider)
    {
        返回的名字
            .OrderBy(一个= GT; lengthProvider(a))的
            .ThenBy(一个=&gt;一种);
    }
}

,你可以使用这样的:

 字符串[]名称= {乔恩,马克,乔尔,托马斯,科普塞,康拉德,安德鲁,布莱恩 条例};
VAR的结果=名称。 AlphaLengthWise(一个= GT;则为a.length);

I want to develop a Generic Extension Method which should arrange the string in alphabetical then by lengthwise ascending order.

I mean

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

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

What is the way to develop Generic Extension Method?

I tried :

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

I received :

Error 1: T does not contain definition for Length

Error 2: can not convert System.Linq.IOrderedEnumerable to T[].

解决方案

The first error is because Length is a property of the String class while in your generic version the type of the T parameter is not known. It could be any type.

The second error is because you return just the query object but not the actual result. You might need to call ToArray() before returning.

With little modifications you could come up with this:

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

Which you could use like this:

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

这篇关于如何创建一个通用的扩展方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆