【问题标题】:How to write a generic sort extension [duplicate]如何编写通用排序扩展[重复]
【发布时间】:2016-06-29 18:56:06
【问题描述】:

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

我想要这样的东西

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

【问题讨论】:

  • 我也许可以用这个 linq 来解决它 ` var foosSorted = Unit.GetFoos().OrderBy(f => f.Name).ToList(); ` 但我仍然很想知道如何使用通用扩展解决方案来实现这一点,因为我对通用部分非常糟糕。
  • @Shiva 是的,我也看到了这个问题。但我仍然想学习通用的替代方案。
  • 你应该选择这个答案stackoverflow.com/a/26406452/1789202
  • @Shiva 这个副本怎么样? OP 知道如何对列表进行排序。需要一种不在重复链接范围内的通用方式。
  • OrderBy 通用解决方案。为什么要写另一个?

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


【解决方案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; }
}

【讨论】:

  • Foo1 和 Foo2 是否应该从 IFoo 扩展?因为如果不是,它看起来就像我理解的那样。
  • 我看到了你的评论因为我的班级有时是单元,有时是小组。所以他们都应该实现一个接口,IFoo,例如。
【解决方案2】:

您的参数应该是您的类型的集合,因此您可以将其视为一个集合,并访问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 那样返回新列表。

【讨论】:

  • 你能把Foo换成T吗?因为有时我的班级是我的单位,有时准确地说是小组。
  • 您还可以传递一个指向您要比较的属性的表达式,例如MySort(x =&gt; x.Propname),这样您就可以比较任何类型以进行排序
  • @radbyx 你的UnitGroup 类是否共享一个暴露Name 的接口?如果不是,您无法将其设为通用,您必须改用 dynamic
  • 不,他们不共享接口。它们的共同点是都有一个 Name 属性。那你能改成动态解决方案吗?
  • name 属性是不是一刀切?制作一个接口来支持它,并使用该接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多