泛型问题排序

时间:2011-09-27 11:00:47

标签: c# .net generics

在接受采访时他们告诉我

将代码写在括号中以订购列表。他们说订单,但你不知道类型是int还是decimal

他们还告诉我不要使用像.sort

这样的框架方法

所以我不知道我该怎么做?我需要做好准备,下次有人问我这个。

可能的输入:7,3,8,6,1
或者:6.9,4.5,2.3,6.1,9.9

namespace InterViewPreparation1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnSort_Click(object sender, EventArgs e)
        {
            List<int> list= new List<int>();
            list.Add(int.Parse(i1.Text));
            list.Add(int.Parse(i2.Text));
            list.Add(int.Parse(i3.Text));
            list.Add(int.Parse(i4.Text));
            list.Add(int.Parse(i5.Text));
            Sort(list);
        }


        private void Sort<T>(List<T> list)
        {
            bool madeChanges;
            int itemCount = list.Count;
            do
            {
                madeChanges = false;
                itemCount--;
                for (int i = 0; i < itemCount; i++)
                {
                    int result = Comparer<T>.Default.Compare(list[i], list[i + 1]);

                    if (result > 0)
                    {
                        Swap(list, i, i + 1);
                        madeChanges = true;
                    }
                }
            } while (madeChanges);            
        }


        public  List<T> Swap<T>(this List<T> list,
                int firstIndex,
                int secondIndex)
        {
            T temp = list[firstIndex];
            list[firstIndex] = list[secondIndex];
            list[secondIndex] = temp;

            return list;
        }
    }
}

2 个答案:

答案 0 :(得分:6)

这取决于你去“不使用框架方法”的路线。或者我们应该使用逻辑探针来对抗原始内存?坦率地说,只使用list.Sort()是愚蠢的(这是一个糟糕的面试问题,IMO;我认为“不,我正在使用list.Sort() - 它存在并且确实存在很好地工作“)。

但是!这里的另一种方法是获得:

var comparer = System.Collections.Generic.Comparer<T>.Default;

现在你有一个类型安全的比较器,适用于任何具有可排序性的T。将.Compare多次调用以按顺序排列的行为留作练习,任何文本书排序策略都可以使用comparer.Compare(x, y)

答案 1 :(得分:4)

好吧,IntDouble都会实现IComparable - 这意味着您应该在执行排序时将每个元素转换为IComparable。由于您不能使用任何标准的.Net排序方法,您需要自己实现。请参阅Sorting algorithm获取一些灵感。

如果方法签名不同,会更容易:

public void sortlist<T>(List<T> list)
    where T : IComparable
{

}

bubble sort的示例实现:

for (int pass = 1; pass < list.Count; pass++)
{
    for (int i = 0; i < list.Count; i++)
    {
        if (list[i].CompareTo(list[i + 1]) > 0)
        {
            // Swap
            T temp = list[i];
            list[i] = list[i + 1];
            list[i + 1] = temp;
        }
    }
}

或者如果T不限于IComparable,那么您可以使用Comparer<T>.Default按照Marcs的建议稍微调整一下:

Comparer<T>.Default.Compare(list[i], list[i + 1])