我的C#ListView比较函数太慢

本文关键字:函数 比较 C#ListView 我的 | 更新日期: 2023-09-27 18:25:56

我正在尝试对ListView进行排序,它也有一个DateTime列。这是我使用的代码:

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

我的C#ListView比较函数太慢

我想到了一些优化:

  1. 使用DateTime.TryParse 代替isDate

  2. 而不是进行两次铸造:

    if (!(o1 is ListViewItem)) return (0);

    ListViewItem lvi1 = (ListViewItem)o2;

使用一次性铸造:

var lvi1 = o2 as ListViewItem;
if (lvi1 == null)
   return 0;

此外,我建议检查您的代码逻辑(正如我在评论中提到的)。

难道不能将ListViewItem.Tag设置为DateTime吗?然后在比较DateTimes:时

DateTime d = (DateTime)ListViewItem.Tag;