2009-06-30 4 views
0

私はC#のAccessファイルエディタで作業していましたが、自分のプログラムに検索機能を追加しようとしています。これまでのところ、データベースファイルに2次元配列を設定して、別のウィンドウでListViewボックスを作成しました。この新しいウィンドウから、モデル番号で各エントリを検索できるようにしたいと思います。これまでのところ、私はLevensteinアルゴリズムを組み込むことに成功しました。私は、各エントリと検索キーボードとの間の距離値を割り当て、その値を別の整数配列に割り当てるアルゴリズムを得ることができます。結果を並べ替えることもできます。Levensteinアルゴリズムの結果を使用して文字列配列を並べ替える

しかし私の現在の問題は、最も関連性の高い結果がListViewの最初の選択肢になるように、Levensteinアルゴリズムの距離値と同じ点でモデル番号をソートしたいと思うことです。任意のアイデア誰ですか?!?!ここで

は私がこれまで持っているものです:

private void OnSearch(object sender, System.EventArgs e) 
    { 

     string a; 
     string b; 
     int[] result = new int[1000]; 
     int[] sorted = new int[1000]; 

      for (int i = 0; i < rowC; i++) 
      { 
       a = PartNum[i];   // Array to search 
       b = SearchBox1.Text;  // keyword to search with 

       if (GetDistance(a, b) == 0) 
       { 
        return; 
       } 

       result[i] = GetDistance(a, b); //add each distance result into array 

      } 

      int index; 
      int x; 

      for (int j = 1; j < rowC; j++)  //quick insertion sort 
      { 
       index = result[j]; 
       x = j; 

       while ((x > 0) && (result[x - 1] > index)) 
       { 
        result[x] = result[x - 1]; 
        x = x - 1; 
       } 
       result[x] = index; 
      } 

     } 


    public static int GetDistance(string s, string t) 
    { 
     if (String.IsNullOrEmpty(s) || String.IsNullOrEmpty(t)) 
     { 
      MessageBox.Show("Please enter something to search!!"); 
      return 0; 

     } 

     int n = s.Length; 
     int m = t.Length; 
     if (n == 0) 
     { 
      return m; 
     } 

     else if (m == 0) 
     { 
      return n; 
     } 

     int[] p = new int[n + 1]; 
     int[] d = new int[n + 1]; 
     int[] _d; 
     char t_j; 
     int cost; 

     for (int i = 0; i <= n; i++) 
     { 
      p[i] = i; 
     } 

     for (int j = 1; j <= m; j++) 
     { 
      t_j = t[j - 1]; 
      d[0] = j; 

      for (int i = 1; i <= n; i++) 
      { 
       cost = (s[i - 1] == t_j) ? 0 : 1; 
       d[i] = Math.Min(Math.Min(d[i - 1] + 1, p[i] + 1), p[i - 1] + cost); 
      } 
      _d = p; 
      p = d; 
      d = _d; 
     } 
     return p[n]; 
    } 

答えて

0

あなたはLINQはあなたに利用できる持っていますか?その場合:

var ordered = PartNum.OrderBy(x => GetDistance(x, SearchBox1.Text)) 
        .ToList(); 

// Do whatever with the ordered list 

注意あなたが完全一致を見つけるだけでなく、実際の距離を利用可能でない場合、これは早期中止ではないという欠点を持っていること - それはあなたがとにかく結果を使用しているか定かではありません...

別のオプションは、次のようになります。

var ordered = (from word in PartNum 
       let distance = GetDistance(word, SearchBox1.Text)) 
       orderby distance 
       select new { word, distance }).ToList(); 

は、その後、あなたは同様に距離を持っています。

+0

2番目のオプションを使用してTakeWhile()を挿入するとどうなりますか?あなたは次のようなものになります: "...})。TakeWhile(i => i.distance!= 0).ToList();" 最後のインデックスを確認して使用するか、後で並べ替えることができます。 –

+0

真。可能であれば、私はそれを単純にしておきたいと思う。余分な仕事が何かを害するとは思っていない。しかし、オプションを持っているニース:) –

0

Levenstein距離で配列を並べ替えるには、アレイの一部としてモデル番号を含める必要があります。そのため、Levenstein番号で配列を並べ替えると、モデル番号が移動するようになります。その後、

public class Part 
{ 
    public string PartNumber; 
    public int LevensteinDistance; 
} 

やパートの配列を作成します:これを行うには

、各パートを表すクラスを作成します

Part[] parts; 

あなたがそのようにように各要素を参照することができます。

parts[n].LevensteinDistance 
parts[n].PartNumber 
関連する問題