我想排序ListView
其中也有一個DateTime
列。這是我使用的代碼:我的C#ListView比較函數太慢
public bool isDate(Object obj)
{
string strDate = obj.ToString();
try
{
DateTime dt = DateTime.Parse(strDate);
if (dt != DateTime.MinValue && dt != DateTime.MaxValue)
return true;
return false;
}
catch
{
return false;
}
}
public int Compare(object o1, object o2)
{
if (!(o1 is ListViewItem))
return (0);
if (!(o2 is ListViewItem))
return (0);
ListViewItem lvi1 = (ListViewItem)o2;
string str1 = lvi1.SubItems[ByColumn].Text;
ListViewItem lvi2 = (ListViewItem)o1;
string str2 = lvi2.SubItems[ByColumn].Text;
int result;
if (lvi1.ListView.Sorting == SortOrder.Ascending)
{
if (isDate(str1) && isDate(str2))
result = DateTime.Compare(DateTime.Parse(str1), DateTime.Parse(str2));
else
result = String.Compare(str1, str2);
}
else
result = String.Compare(str2, str1);
LastSort = ByColumn;
return result;
}
的ListView
持有約2000項,問題是,這是非常緩慢的。我究竟做錯了什麼?有任何想法嗎?
在此先感謝!
編輯:非常感謝。我是新手,現在是我的代碼。它快得多,我確定了我的邏輯。
public int Compare(object o1, object o2)
{
var lvi1 = o2 as ListViewItem;
var lvi2 = o1 as ListViewItem;
if (lvi1 == null || lvi2 == null)
return 0;
string str1 = lvi1.SubItems[ByColumn].Text;
string str2 = lvi2.SubItems[ByColumn].Text;
int result;
DateTime dateValue1 = new DateTime();
DateTime dateValue2 = new DateTime();
if (lvi1.ListView.Sorting == SortOrder.Ascending)
{
if (DateTime.TryParse(str1, out dateValue1) && DateTime.TryParse(str2, out dateValue2))
result = DateTime.Compare(dateValue1, dateValue2);
else
result = String.Compare(str1, str2);
}
else
{
if (DateTime.TryParse(str1, out dateValue1) && DateTime.TryParse(str2, out dateValue2))
result = DateTime.Compare(dateValue2, dateValue1);
else
result = String.Compare(str2, str1);
}
LastSort = ByColumn;
return result;
}
這是使用WPF?如果是這樣,你能標記它嗎? – mindandmedia 2012-02-24 23:59:38
爲什麼不使用'DateTime.TryParse()'而不是捕獲解析異常?它返回一個'bool',並使用一個輸出參數來設置成功的值。 – 2012-02-25 00:02:46
另外我認爲你的邏輯有問題,當排序順序是升序時,你關心的是DateTime字段,但在其他情況下(降序)你不關心這個問題。 – 2012-02-25 00:04:08