2017-01-13 5 views
2

私のデータベースはcsvファイルで構成されています。私は最初の列でアルファベット順にしておきたいので、検索時に検索項目がリスト内で見つかる場所を過ぎてから止めることができます。アルファベット順リストを検索して追加する

セットアップ:私はfullDBと呼ばれるList<string>にcsvファイル全体を読みました。私はitemToFindという検索文字列を持っています。ここに私の検索コードは次のとおりです。

public string[] isFoundInDB(List<string> fullDB, string itemToFind) 
{ 
    for (int i = 0; i < fullDB.Count; i++) 
    { 
     string[] line = fullDB[i].Split(','); 

     if (itemToFind.CompareTo(line[0]) < 0) 
     { 
      return new string[] { "-1", i.ToString(), "-1", "-1", "-1", "-1" }; //not found 
     } 

     if (line[0] == itemToFind) 
     { 
      return new string[] { i.ToString(), line[0], line[1], line[2], line[3], line[4] }; 
     } 
    } 

    return new string[] { "-1", fullDB.Count.ToString(), "-1", "-1", "-1", "-1" }; //not found 
} 

だからこれは私にそれがデータベース内で見つかったインデックスを与えるいずれか、またはそれは私にitemToFindはそれがアルファベット順になるところを過ぎていった指標を与えます。見つかった場合は、そこにある値を変更します。それが見つからない場合は、私がアルファベット順に使用して、正しい場所でそれを挿入しList.Insert

私の質問で、itemToFindがデータベースで見つからない場合には、私の現在のList.Insertを行うことが、より効率的で、OR List.Addを行うだろうその後、私は物事を追加し終わったときに全体を並べ替えますか?このコードを使用して、データベース全体を並べ替えることができます:

IEnumerable<string> query = 
    from line in fullDB 
    let x = line.Split(',') 
    orderby x[0] 
    select x[0] + "," + x[1] + "," + x[2] + "," + x[3] + "," + x[4]; 

fullDB = query.ToList(); 

また別の方法がありますか? C#を使用して

、.NETフレームワーク4.0

+0

あなたのコードがうまくいくなら、おそらくcodereview.stackexchange.comで尋ねる前に再度確認してください。 – TheLethalCoder

答えて

1

は私がキーとして最初の列とSortedDictionaryを使用します。

List<string> lines = ... // read csv file 

SortedDictionary<string, string> sortedLines = new SortedDictionary<string, string>(); 
foreach (string line in lines) 
{ 
    string[] fields = line.Split(','); 
    sortedLines[fields[0]] = line; 
} 

次にあなたがOを行うことができるようになります(nはログ)検索:最初の列が一意でない場合

string foundLine; 
if (sortedLines.TryGetValue(itemToFind, out foundLine)) 
{ 
    ... // handle the found line 
} 
else 
{ 
    // add a new line: 
    string newLine = // ... 
    sortedLines.Add(itemToFind, newLine); 
} 

あなたが使用することができます:

SortedDictionary<string, List<string>> 
+0

遅いコメントをおかけして申し訳ありません。これは完全に機能し、非常に高速です。ありがとう! – Aeon2058

関連する問題