2009-06-30 2 views
0

Ich habe an einem Access-Datei-Editor in C# gearbeitet, und ich habe versucht, eine Suchfunktion zu meinem Programm hinzugefügt. Bisher habe ich mit der Datenbankdatei ein 2D-Array gefüllt, das ich dann dazu nutze, ein ListView-Feld in ein anderes Fenster zu füllen. Von diesem neuen Fenster aus möchte ich in der Lage sein, jeden Eintrag nach Modellnummer zu durchsuchen. Bisher habe ich es geschafft, den Levenstein-Algorithmus zu integrieren, der sehr nützlich zu sein scheint. Ich kann den Algorithmus dazu bringen, den Abstandswert zwischen jedem Eintrag und der Suchtastatur zu bestimmen und diesen Wert einem anderen ganzzahligen Array zuzuordnen. Ich kann die Ergebnisse auch in aufsteigender Reihenfolge sortieren.String-Array mit Levenstein Algorithmus-Ergebnissen sortieren

Mein aktuelles Problem ist jedoch, dass ich die Modellnummern mit dem gleichen Abstand zu den Abstandswerten aus dem Levenstein-Algorithmus sortiert haben möchte, damit das relevanteste Ergebnis zur ersten Wahl in der ListView-Box wird. Irgendwelche Ideen jemand ??!?!

Hier ist, was ich bisher habe:

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]; 
    } 

Antwort

0

Haben Sie LINQ Ihnen zur Verfügung? Wenn ja:

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

// Do whatever with the ordered list 

Beachten Sie, dass dies den Nachteil, nicht Abbruch früh hat, wenn Sie eine genaue Übereinstimmung finden, sowie nicht die tatsächlichen Entfernungen verfügbar zu machen - aber es ist nicht ganz klar, wie Sie die Ergebnisse verwenden sowieso ...

Eine andere Möglichkeit wäre:

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

Dann Sie die Entfernung als auch haben.

+0

Was ist mit der zweiten Option und Einfügen einer TakeWhile()? Sie haben am Ende etwas wie folgt: "...}). TakeWhile (i => i.distance! = 0). ToList();" Sie könnten dann den letzten Index überprüfen und verwenden oder danach sortieren. –

+0

Wahr. Ich denke, ich würde es wahrscheinlich so einfach wie möglich halten - ich bezweifle, dass die zusätzliche Arbeit irgendetwas beschädigen wird. Schön die Option zu haben :) –

0

Um Ihr Array nach Levenstein-Distanz zu sortieren, müssen Sie die Modellnummern als Teil Ihres Arrays angeben, so dass die Modellnummern bei der Sortierung nach der Levenstein-Nummer für die Fahrt mitgehen.

Um dies zu tun, erstellen Sie eine Klasse repräsentiert jedes Teil:

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

und dann eine Reihe von Teil erstellen:

parts[n].LevensteinDistance 
parts[n].PartNumber 
:

Part[] parts; 

Sie dann jedes Element wie so verweisen können