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

时间:2016-06-12 13:31:24

标签: c# sorting filestream

我有一个带有交付(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();
    }

}

4 个答案:

答案 0 :(得分:0)

我猜myDeliverables的类型为List<Deliverable>

.NET中没有允许插入元素并在插入时对其进行排序的列表and for a good reason

首先,考虑一下确实是否需要对插入进行排序。如果您正在阅读的元素列表不是太大,或者您没有频繁地从文件中的元素填充列表,那么在最后对所有内容进行排序的性能不应该是一个问题。

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

所以,重点是:如果您处于这种情况,那么List不是正确的数据结构。我建议使用SortedList数据结构,但与它的名称可能暗示的相反,它实际上不是List,而是地图,即。它需要一对键/值元素),你会得到插入的排序。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以尝试向List添加新的Deliverable项目,然后对该列表进行排序,但我建议您使用SortedList

答案 3 :(得分:0)

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