我想开发一个通用的扩展方法,它应该按字母顺序排列字符串,然后按纵向升序排列。
我是说
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[]
。
发布于 2009-12-01 20:43:37
第一个错误是因为Length
是String
类的属性,而在您的泛型版本中,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);
发布于 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;
}
}
发布于 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>
等。
https://stackoverflow.com/questions/1825952
复制相似问题