请原谅我的第一篇文章。我对一项大学作业有意见。分配是一个"数字列表管理器",基本上用户选择一个单选按钮(排序或未排序(,当他们单击按钮时,30个数字将根据用户的选择添加到列表框中。我对未排序的代码没有意见。讲师特别希望我们将排序后的数字添加到列表中,并在添加时对其进行排序,而不是生成整个列表然后进行排序。
if (radUnsorted.Checked == true)//if unsorted
{
RunChecks();
do
{
numberToInput = (rnd.Next(0, 100));//sets number to input to random number
int i = 1;
while (i < lstNumbers.Items.Count)//loops though whole list
{
if (numberToInput == ConvertToInt32(lstNumbers.Items[i]))//checks that number doesnt already exist in list
{
numberToInput = (rnd.Next(0, 101));//genrate new random number
i = 0;//set to 0 to restart checking through the list
}
else//if the number isnt at i index
{
i++;//move onto next number
}
}
lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
RunChecks();//check if the list is full
} while (spaceLeft == true);//keep looping untill list is full
}
这是我在未排序的位置将数字添加到列表中的代码。我试过在网上查找,但我能看到的唯一方法是用for循环将数字添加到列表中,然后用另一个for循环对它们进行排序。
以下是标准片段:在插入和删除过程中,您必须使用自己的代码来操作列表,而不能使用自动执行任务的C#方法。例如,插入到未排序的列表中只需要将新值放置在当前最后一个条目之后的下一个可用位置,而插入到排序的列表则需要您的代码定位插入点并移动到更高的位置值条目打开/释放插入点以包含新值。
我不要求任何人为我做这项工作,但即使是伪代码也会非常感谢
好吧,首先我不确定这些检查列表是否已满是为了什么,难道你每次按下按钮并迭代1到30时就不能清除项目吗?
不管怎样,这里有一些我为排序和未排序的代码:
private void unsorted_Click(object sender, EventArgs e)
{
lstNumbers.Items.Clear(); //clear any existing numbers, and add a new 30.
var rand = new Random();
for (var i = 0; i < 30; i++)
{
var randNumber = rand.Next(0, 100);
while (lstNumbers.Items.Contains(randNumber))
{
//generate new number until it's unique to the list.
randNumber = rand.Next(0, 100);
}
lstNumbers.Items.Add(randNumber);
}
}
private void sorted_Click(object sender, EventArgs e)
{
lstNumbers.Items.Clear(); //clear any existing numbers, and add a new 30.
var rand = new Random();
for (var i = 0; i < 30; i++)
{
var randNumber = rand.Next(0, 100);
while (lstNumbers.Items.Contains(randNumber))
{
//generate new number until it's unique to the list.
randNumber = rand.Next(0, 100);
}
if (lstNumbers.Items.Count == 0)
{
//we have no items, obviously the default position would be 0.
lstNumbers.Items.Add(randNumber);
continue; //next iteration
}
//find out the sorted position
var bestPos = 0;
for (var j = 0; j < lstNumbers.Items.Count; j++) //loop through the current list.
{
var currValue = Convert.ToInt32(lstNumbers.Items[j]);
if (randNumber > currValue)
{
bestPos = j + 1;
}
else
{
bestPos = j;
break; //we no longer need to check, it will never be any less than this.
}
}
if (bestPos < 0)
bestPos = 0;
lstNumbers.Items.Insert(bestPos, randNumber);
}
}
您已经在遍历列表并读取每个值,所以您所需要做的就是检查现有值是否大于要插入的值。如果是这样,您应该将它插入到刚刚检查的项目之前。
var inserted = false;
while (i < lstNumbers.Items.Count)//loops though whole list
{
if (numberToInput == Convert.ToInt32(lstNumbers.Items[i]))//checks that number doesnt already exist in list
{
numberToInput = (rnd.Next(0, 101));//genrate new random number
i = 0;//set to 0 to restart checking through the list
}
else if (numberToInput < Convert.ToInt32(lstNumbers.Items[i])
{
lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
inserted = true;
}
else//if the number isnt at i index
{
i++;//move onto next number
}
}
if (!inserted)
{
lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
}
注意检查新项目何时需要放在列表末尾。
我想这就是你的老师想要的,了解如何使用数组很重要,但在C#中对列表进行排序的最好方法不是使用数组,而是使用list或其他有自己排序方法的类。
var myList = new List<int>();
myList.Add(5);
myList.Add(3);
myList.Add(1);
myList.Sort();
如果你有一百万个项目,这将更快、更高效,而且它适用于字符串、日期或其他任何东西。
List
还有一个Contains
方法,以及其他一些让生活更轻松的快捷方式@PerplexedOne是正确的,在填充列表后进行排序,您可以使用SortedList,它会自动将项目插入正确的位置。
我用SortedList做了一个更简单的方法来解决这个问题。
SortedList<int, object> sortedList = new SortedList<int, object>();
sortedList.Add(4, null);
sortedList.Add(1, null);
sortedList.Add(7, null);
foreach(KeyValuePair<int, object> k in sortedList)
{
Console.WriteLine(k.Key);
}