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];
}
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. –
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 :) –