前天有朋友说,在Sbo的Matrix中定位1万多条需要很长时间,今天写了一个使用二分法进行顺序查找的函数,大大提高了定位效率,具体提高多少?(10倍以上吧,随着数据量越大,效率显现越高,完全可能达到几十倍甚至上百倍)。不过,前提是您的数据是需要按照指定的查询字段排序了的。有兴趣的朋友可以非常容易的扩展到其它控件关联的方式。
public int FindMatchData(SAPbouiCOM.DBDataSource ds, int nStartRow, int nEndRow, string strColName, string strFindValue, Boolean bFullMatch)
        {
            string strValue = "";
            if (nStartRow >= ds.Size)
            {
                nStartRow = nEndRow;
                nEndRow = ds.Size - 1;
            }
            if (nEndRow >= ds.Size) nEndRow = ds.Size - 1;
            if (nStartRow > nEndRow) return -1;
            strValue = ds.GetValue(strColName, nStartRow);
            if (strValue.StartsWith(strFindValue) && !bFullMatch)
                return nStartRow;
            else if (strValue == strFindValue && bFullMatch)
                return nStartRow;
            strValue = ds.GetValue(strColName, nEndRow);
            if (strValue.StartsWith(strFindValue) && !bFullMatch)
                return nEndRow;
            else if (strValue == strFindValue && bFullMatch)
                return nEndRow;
            if (nStartRow == nEndRow) return -1;
            int nRow = (nEndRow - nStartRow) / 2 + nStartRow;
            strValue = ds.GetValue(strColName, nRow);
            if (strValue.StartsWith(strFindValue) && !bFullMatch)
                return nRow;
            else if (strValue == strFindValue && bFullMatch)
                return nRow;
            else
            {
                if (strValue.CompareTo(strFindValue) > 0)
                    nEndRow = nRow;
                else
                    nStartRow = nRow;
                return FindMatchData(ds, nStartRow + 1, nEndRow - 1, strColName, strFindValue, bFullMatch);
            }
        }
代码在Sbo 2005B+C#.2005+SQL Server 2000上测试通过。