繁体   English   中英

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

[英]Sorting a List while reading from file in c#

我有一个包含交货(id,重量,...等)的文本文件,我从一个文本文件中读取了这些文件并将其保存在列表中。 清单准备好后,我必须按正确的顺序对其进行排序,只有这样我才能工作。

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

您可以在下面看到我的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();
    }

}

我猜myDeliverables的类型为List<Deliverable>

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

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

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

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

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

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

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

我认为您不能仅使用for循环来执行此操作-因为这必须同时使用两个循环-插入算法在Internet中对其进行检查,因此有很多信息。 如果使用插入算法(至少是我使用的算法),请注意,首先要添加this.myDeliverables.Add(new Deliverable(id,weight,per)); 否则,它将跳过最后一项,即我认为的第15条,当您不了解排序算法时,第二项分配的确确实有些混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM