PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: compare Methode für ListView


Elemental
2006-04-26, 21:15:05
Hallo,
ich versuch mich gerade das erste mal an einer ListView. Das mit den Spalten sortieren is ja garnet so einfach.

Ich hab mir eine Klasse gemacht, die das IComparer Interface implementiert.
Das dumme ist nur, dass manche Spalten in meiner ListView Integer und andere Strings enthalten. Mein Versuch für die Compare-Methode sieht so aus:


public int Compare(object x, object y)
{
string strText1 = ((ListViewItem)x).SubItems[iCol].Text;
string strText2 = ((ListViewItem)y).SubItems[iCol].Text;

try
{
//try to sort as integer
int iNumber1 = int.Parse(strText1);
int iNumber2 = int.Parse(strText2);

if (bSortAscending)
{
return (iNumber1 - iNumber2);
}
else
{
return (iNumber2 - iNumber1);
}
}
catch (Exception ex)
{
//hide the exception
ex = ex;
}


//sort as string
if (bSortAscending)
{
return String.Compare(strText1, strText2);
}
else
{
return String.Compare(strText2, strText1);
}
}


Das funktioniert wunderbar, wenn die zu sortierende Spalte integer enthält, aber wenn eine Spalte mit Strings sortiert werden soll, ist es sau langsam!

Zuerst hatte ich den ganzen try-catch Teil für integer nicht drin, dann werden die Strings auch schnell sortiert, nur werden die Integer dann natürlich nicht richtig sortiert (d.h. nicht 1,2,3,10,100 sondern 1,10,100,2,3)


Ich mach doch hier nichts neues. Es muss doch einen performanten Weg für sowas geben, oder?


mfG
Elemental

Gast
2006-04-26, 21:24:56
int.TryParse ist dein Freund.

Desweiteren kein Exception Handling für den "normalen" Programmverlauf benützen. Wie du siehst es ja dezent langsam.

Elemental
2006-04-26, 21:31:44
Hmm, OK, dann probier ichs mal damit.
Hatte inzwischen den Umweg über eine Liste gewählt, in der ich mir merke, welche Spalten Strings enthalten:

public int Compare(object x, object y)
{
string strText1 = ((ListViewItem)x).SubItems[iCol].Text;
string strText2 = ((ListViewItem)y).SubItems[iCol].Text;

if (!m_ListStringColumns.Contains(iCol))
{
try
{
//try to sort as integer
int iNumber1 = int.Parse(strText1);
int iNumber2 = int.Parse(strText2);

return Compare(iNumber1, iNumber2);
}
catch (Exception)
{
m_ListStringColumns.Add(iCol);
}
}

//sort as string
return Compare(strText1, strText2);
}


Ist auch schnell!
Aber jetzt lieber mit TryParse. Ist eleganter :D Danke!