【问题标题】:Generic sorting in c#, type constraintsc#中的通用排序,类型约束
【发布时间】:2023-03-07 13:29:01
【问题描述】:

很多谷歌搜索,仍然没有答案。

有什么问题: 我正在尝试实现通用排序方法来对自定义对象和值类型进行排序,如 int、uint 等。快速排序、堆排序等没有问题。此外,由于它的特殊性,我发现计数排序不可能做到。所有数据必须是非负整数。

问题:

where T : struct..

不要给所需的一元运算符“+-”,据我所知,不可能强制它。如何设置正确的类型约束,或者如何强制 T 有运算符“+-”?

public interface ISortMethod<T> where T : IComparable<T>
{
    T[] Sort(T[] tablica);
}

public class CountingSort<T> : ISortMethod<T>
    where T : IComparable<T> 
{
    public T[] Sort(T[] tablica)
    {
        T[] tab2 = (T[])tablica.Clone();
        return Sortuj(tab2);
    }

    private T[] Sortuj(T[] tab)
    {
        T min = tab[0];
        T max = tab[0];

        T[] res = new T[tab.Length];

        //< 0 wczesniejsza this
        for (int i = 0; i < tab.Length; i++)
        {
            if (tab[i].CompareTo(max) > 0)
                max = tab[i];

            if (tab[i].CompareTo(min) < 0)
                min = tab[i];
        }

        T[] cData = new T[**(max - min)** + 1];

        for (int i = 0; i < tab.Length; i++)
            **cData[tab[i] - min] += 1**;

        for (int i = 1; i < cData.Length; i++)
            cData[i] += cData[i - 1];

        for (int i = tab.Length-1; i >= 0 ; i--)
        {
            res[cData[tab[i] - min] - 1] = tab[i];
            cData[tab[i] - min]--;
        }

        return res;
    }
}

有什么想法吗? :)

【问题讨论】:

标签: c# oop types constraints


【解决方案1】:

您不能使用 C# 泛型约束强制泛型类型参数具有 任何 运算符。

【讨论】:

    【解决方案2】:

    解决方法是使用Comparer&lt;T&gt;,或者你自己的IComparer&lt;T&gt;实现,或者Comparison&lt;T&gt;;这些通过返回一个整数告诉你两个对象的顺序。您将整数与通常的运算符进行比较;如果整数为负数,则第一个对象较小,如果为零,则它们相等,如果为正数,则第一个对象较大。

    由于无论如何您都必须使用比较器或比较器,您不妨只使用将其中之一作为参数的框架方法。

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多