【问题标题】:Sorting a List with type T对类型为 T 的列表进行排序
【发布时间】:2014-06-02 11:40:47
【问题描述】:

我正在尝试使用冒泡排序对<T> 类型的列表进行排序。不幸的是,我在比较未知类型的对象时遇到了问题。

到目前为止我已经尝试过:

public static void BubbleSort<T>(this List<T> array)
{
    for (int i = (array.Count - 1); i >= 0; i--)
    {
        for (int j = 1; j <= i; j++)
        {
            if (array[j - 1] > array[j]) // issue here
            {
                var temp = array[j - 1];
                array[j - 1] = array[j];
                array[j] = temp;
            }
        }
    }
}

【问题讨论】:

  • 考虑使用IComparer&lt;T&gt; 参数...或使用Comparer&lt;T&gt;.Default。鉴于List&lt;T&gt; 不是数组,我强烈 考虑重命名您的参数。 (我认为这仅用于教育目的?)
  • @Sriram 我假设他正在学习冒泡排序的工作原理。
  • @Carra 我很欣赏学习,但除非有充分的理由,否则我将使用List.Sort 而不是我们自己的版本。
  • @Sriram Sakthivel 我打赌你会回到这里,如果你需要一个方法来说明你 List 是否已排序:)
  • 我不需要 BubbleSort 实现。我想我没有遗漏什么吗?我是吗?

标签: c# list sorting


【解决方案1】:

如果你不需要除了默认比较之外的任何东西,你可以使用:

// TODO: Rename the parameter...
public static void BubbleSort<T>(this List<T> array)
{
    IComparer<T> comparer = Comparer<T>.Default;
    ...
    if (comparer.Compare(array[j - 1], array[j]) > 0)
    {
        ...
    }
}

或者允许自定义比较:

public static void BubbleSort<T>(this List<T> array, IComparer<T> comparer)
{
    ...
    if (comparer.Compare(array[j - 1], array[j]) > 0)
    {
        ...
    }
}

或者将T 限制为实现IComparable&lt;T&gt; 的类型:

public static void BubbleSort<T>(this List<T> array) where T : IComparable<T>
{
    ...
    if (array[j - 1].CompareTo(array[j]) > 0)
    {
        ...
    }
}

请注意,在此处添加对T 的约束意味着任何调用者都需要知道他们使用的类型参数需要实现IComparable&lt;T&gt;...这使得它在编译时更安全,代价是约束在调用链中向上传播。 (一种选择是允许不带比较器的受限版本和带比较器的无约束版本。)

【讨论】:

    【解决方案2】:

    不,您不能将 2 个T 值与&gt; 进行比较。

    首先你需要在T上添加一个约束:

    public static void BubbleSort<T>(this List<T> array)
       where T : IComparable<T>
    {
    }
    

    然后你就可以打电话了

    //if (array[j - 1] > array[j]) // issue here
    if (array[j - 1].CompareTo(array[j]) > 0) // solved
    

    【讨论】:

    • +1 关于让扩展方法显式放置类型约束以使其具有可比性。
    【解决方案3】:

    一种可能性是要求T 实现IComparableIComparable&lt;T&gt; 接口,定义为herehere

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2020-02-23
      • 2014-11-08
      • 1970-01-01
      • 2011-02-10
      • 2021-12-12
      相关资源
      最近更新 更多