如何编写通用排序扩展
How to write a generic sort extension
如何重写此排序代码示例,使其使用通用扩展而不是第二行?
我想要类似的东西
var foosSorted = Unit.Foos().MyGenericSortFunction();
我的工作代码
var foosSorted = Unit.Foos(); // Not sorted yet
foosSorted.Sort((x, y) => string.Compare(x.Name, y.Name));
我对通用扩展的了解程度
public static class ObjectExtension
{
public static T Sort<T>(this T list) where T : ???
{
return list.Sort((x, y) => string.Compare(x.Name, y.Name));
}
}
您的参数应该是您的类型的集合,这样您就可以将其视为一个集合,并访问 Name
属性:
public static class ObjectExtension
{
public static List<Foo> MyGenericSortFunction(this List<Foo> list)
{
list.Sort((x, y) => string.Compare(x.Name, y.Name));
return list;
}
}
您不会在这里使用泛型,因为您特别需要使用 Name
,它是 Foo
class 的 属性。如果它是在接口中定义的,您可以使您的扩展对接口通用。
请注意,这会编辑现有列表,而不是像 LINQ 那样返回新列表。
您打算使列表元素通用吗?像这样:
public static class ObjectExtension
{
public static List<T> Sort<T>(this List<T> list) where T : IFoo
{
list.Sort((x, y) => string.Compare(x.Name, y.Name));
return list;
}
}
public interface IFoo {
string Name { get; }
}
public class Foo1 {
public string Name { get; set; }
}
public class Foo2 {
public string Name { get; set; }
}
如何重写此排序代码示例,使其使用通用扩展而不是第二行?
我想要类似的东西
var foosSorted = Unit.Foos().MyGenericSortFunction();
我的工作代码
var foosSorted = Unit.Foos(); // Not sorted yet
foosSorted.Sort((x, y) => string.Compare(x.Name, y.Name));
我对通用扩展的了解程度
public static class ObjectExtension
{
public static T Sort<T>(this T list) where T : ???
{
return list.Sort((x, y) => string.Compare(x.Name, y.Name));
}
}
您的参数应该是您的类型的集合,这样您就可以将其视为一个集合,并访问 Name
属性:
public static class ObjectExtension
{
public static List<Foo> MyGenericSortFunction(this List<Foo> list)
{
list.Sort((x, y) => string.Compare(x.Name, y.Name));
return list;
}
}
您不会在这里使用泛型,因为您特别需要使用 Name
,它是 Foo
class 的 属性。如果它是在接口中定义的,您可以使您的扩展对接口通用。
请注意,这会编辑现有列表,而不是像 LINQ 那样返回新列表。
您打算使列表元素通用吗?像这样:
public static class ObjectExtension
{
public static List<T> Sort<T>(this List<T> list) where T : IFoo
{
list.Sort((x, y) => string.Compare(x.Name, y.Name));
return list;
}
}
public interface IFoo {
string Name { get; }
}
public class Foo1 {
public string Name { get; set; }
}
public class Foo2 {
public string Name { get; set; }
}