2016-06-12 10 views
0

配送(ID、重量、...など)のテキストファイルがあり、テキストファイルから読み込んでリストに保存します。私のリストが準備された後、私は正しい順序でそれを並べ替える必要があり、その後私は働くことができます。Cでファイルを読み込んでリストをソートする#

私の質問:テキストファイルからデータを読み取っている間に並べ替えられたリストを取得する方法があるので、ファイルから読み取られる各次の成果物をすぐに適切な場所にリストに挿入する必要があります。

あなたは見ることができます以下の私LoadDeliverablesFromFile方法:私はmyDeliverables推測している

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(); 
    } 

} 
+0

myDeliverables.Add(del);リストの最後に追加されます。 InsertAt()を使用して、データを正しい場所に配置します。 – jdweng

+2

Deliverableクラスのどのフィールドにリストを並べ替えるのですか? – Steve

+1

最後にリストをソートすると、どの程度のパフォーマンスが出ますか?不要な最適化の可能性があります。 – James

答えて

0

は型であるList<Deliverable>要素を挿入し、それがでソート得ることができます.NETのリストがない

挿入の瞬間、and for a good reason

まず、の場合は、挿入時に並べ替える必要があります。読んでいる要素のリストがあまりにも大きくない場合や、ファイル内の要素から頻繁にリストを作成しない場合は、最後にすべてをソートしたときのパフォーマンスに問題はありません。

パフォーマンスヒットを測定したところ、それが重要な場合は、配列内の場所に要素を挿入することは最適な選択ではありません。リスト要素はでメモリ内に連続している必要があります。これは、各ソート後にすべてを挿入した後の要素がメモリ内に移動することを意味します。 (リストのサイズによっては、新しいメモリ割り当て+すべての要素のコピーが必要になるかもしれません) リストには挿入時のソート方法がありません。

したがって、ポイントは次のとおりです。この状況では、Listは正しいデータ構造ではありません。 SortedListのデータ構造を使用することをお勧めしますが、名前が示唆しているものとは反対に、実際にはリストではありません。それはキー/値の要素のペアを必要とする)あなたは挿入時にあなたの並べ替えを取得します。

SortedListの要素はキーで並べ替えられているため、並べ替えに使用するDeliverableクラスのフィールドは、IComparableインターフェイスを実装する必要があります(カスタムタイプの場合)。

0

forループを使用してリストを反復し、リストの現在の各要素を追加する予定の項目と比較することができます。リスト内の現在のアイテムがアイテムより少ない場合は、i ++を追加します。そうでなければ、そのインデックスが選択したインデックスです。

0

リストに新しいDeliverableアイテムを追加してから、そのリストをソートしようとすることができます(たとえば、新しい配送可能なアイテム(ID、ウェイト、FindPerson(buyersID))。しかし、私はあなたが使用することをお勧めしますSortedList

0

私はあなたがforループで行うことはできないと思います - これは2つのループを使用する必要があり、while - insertionアルゴリズムはインターネットでそれをチェックするので、挿入アルゴリズムを使用している場合は、最初にthis.myDeliverables.Add(new Deliverable(id、weight、per))を追加します。それ以外の場合は、最後にスキップします私が思うに15番目の項目ですが、2番目の割り当てはソートアルゴリズムを理解していないと少し混乱します。

関連する問題