泛型问题排序
本文关键字:排序 问题 泛型 | 更新日期: 2023-09-27 18:09:41
在一次采访中他们告诉我
写出括号内的代码来排序列表。他们说顺序,但你不知道类型是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;
}
}
}
这取决于你在"不要使用框架方法"这条路线上走了多远。或者我们应该对原始内存使用逻辑探针?坦率地说,不只使用list.Sort()
是愚蠢的(这是一个糟糕的面试问题,在我看来;我会争辩说:"不,我使用的是list.Sort()
——它存在并且很好地完成了这项工作")。
但是!这里的另一种方法是:
var comparer = System.Collections.Generic.Comparer<T>.Default;
现在你有了一个类型安全的比较器,它将适用于任何具有排序性的T
。多次调用.Compare
将其放入顺序中作为练习,任何教科书上的排序策略都可以使用comparer.Compare(x, y)
。
Int和Double都实现了IComparable -这意味着在执行排序时应该将每个元素转换为IComparable类型。因为你不能使用任何标准的。net排序方法,你需要自己实现一个。参考排序算法。
如果方法签名不同,会更容易:
public void sortlist<T>(List<T> list)
where T : IComparable
{
}
冒泡排序的实现示例:
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
的限制,那么你可以根据Marcs的建议稍微调整一下,使用Comparer<T>.Default
:
Comparer<T>.Default.Compare(list[i], list[i + 1])