在c#中读取文件时对列表进行排序



我有一个包含交货(id、weight…等)的文本文件,我从文本文件中读取它们并将它们保存在我的列表中。我的清单准备好后,我必须按正确的顺序排序,只有这样我才能工作。

我的问题是:在读取文本文件中的数据时,是否有一种方法可以对列表进行排序,以便从文件中读取的每个下一个可交付成果都必须立即插入列表中的正确位置。

你可以在下面看到我的LoadDeliverablesFromFile方法:

public void LoadDeliverablesFromFile(String filename)
{
StreamReader sr = null;
string s;
try
{
sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read));
this.myDeliverables.Clear();
s = sr.ReadLine();
while (s != null)
{
string[] words = s.Split(' ');
int id = Convert.ToInt32(words[0]);
int weight = Convert.ToInt32(words[1]);
int buyersID = Convert.ToInt32(words[2]);
Deliverable del = new Deliverable(id, weight, FindPerson(buyersID));
myDeliverables.Add(del);
s = sr.ReadLine();
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
finally
{
if (sr != null) sr.Close();
}
}

您可以使用for循环来遍历列表,将列表中的每个当前元素与您计划添加的项目进行比较。如果列表中的当前项小于要添加i++的项,则该索引就是您选择的索引。然后使用myDeliverables在列表中添加项目。Insert(i,new Deliverable(id,weight,FindPerson(buyersID))。

我猜myDeliverables属于List<Deliverable>类型

NET中没有允许插入元素并在插入时对其进行排序的List,这是有充分理由的

首先,考虑是否真的需要在插入时进行排序。如果您正在读取的元素列表不是太大,或者您没有经常从文件中的元素填充列表,那么在最后对所有内容进行排序的性能应该不会有问题。

如果您已经测量了性能命中率,并且它很重要,那么在数组中的某个位置插入元素并不是最佳选择。列表元素在内存中必须连续,这意味着每次排序插入后,插入索引后的所有元素都将在内存中移动。(根据列表的大小,可能需要新的内存分配+所有元素的副本)这就是为什么列表不提供在插入时进行排序的方法

因此,重点是:如果您处于这种情况,那么List不是合适的数据结构。我建议使用SortedList数据结构,但与它的名称可能暗示的相反,它实际上不是一个List,而是一个映射,)即它需要一对键/值元素),并且您将在插入时获得排序。

SortedList中的元素是按键排序的,因此要用于排序的Deliverable类的字段必须实现IComparable接口(如果它是自定义类型)。

您可以尝试将新的可交付项目添加到列表中,然后对该列表进行排序,但我建议您使用SortedList

我认为你不能只使用for循环-因为这必须使用两个for和while循环-插入算法在互联网上检查它,有很多信息。如果你使用插入算法(这至少是我使用的),请注意,你首先添加this.myDeliverables.add(new Deliverable(id,weight,per));否则它会跳过最后一项,我认为这是第15项,当你不理解排序算法时,第二项作业确实有点令人困惑。

相关内容

  • 没有找到相关文章

最新更新