如何编写通用排序扩展

时间:2016-06-29 18:56:07

标签: c# generics extension-methods generic-list

如何重新编写此排序代码示例,以便使用通用扩展而不是第二行?

我想要像

这样的内容
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));
    }
}

2 个答案:

答案 0 :(得分:1)

您的参数应该是您的类型的集合,因此您可以将其视为集合,并访问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类的属性。如果它是在界面中定义的,则可以使扩展通用于界面。

请注意,这会编辑现有列表,而不是像LINQ那样返回一个新列表。

答案 1 :(得分:1)

您打算将列表元素设为通用吗?像这样:

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