| 
 | 
  |  |   |    | 文件多了我们找起来会很困难,我们现在来做一个关于VB.NET文件名排序的一个小案例,以后你的文件都会按一定的顺序排列,也加快你的查询速度。 VB.NET文件名排序案例: 输入 : a1,a2,a10,a001 。我们知道,如果按照字符串比较,结果应该是 a001,a1,a10,a2,但我们期望的结果应该是a001,a1,a2,a10. 自己写了一个VB.NET文件名排序算法,请参考,或者有更好的算法,请赐教 - VB.NET code /*  
 - Return Value Description  
 - < 0  arg1 less than arg2  
 - 0  arg1 equivalent to arg2  
 - > 0  arg1 greater than arg2  
 - */  
 - int compare(const void* arg1,const void* arg2)  
 - {  
 - if (NULL==arg1||NULL==arg2)//address of item  
 - return 0;  
 - LPSTR lpText1 = *( TCHAR** )arg1; //content of item  
 - LPSTR lpText2 = *( TCHAR** )arg2; //content of item  
 - if (NULL==lpText1||NULL==lpText2)  
 - return 0;  
 - int nText1Len = _tcslen(lpText1);  
 - int nText2Len = _tcslen(lpText2);  
 - int nText1IndexHandled = 0;  
 - int nText2IndexHandled = 0;  
 - int nRet = 0;  
 - for (;;)  
 - {  
 - if (nText1IndexHandled==nText1Len||nText2IndexHandled==nText2Len) //don't compare complete since all are same, "ab","abc"  
 - {  
 - TCHAR chOffset1 = nText1IndexHandled<nText1Len?lpText1[nText1IndexHandled]:0;  
 - TCHAR chOffset2 = nText2IndexHandled<nText2Len?lpText2[nText2IndexHandled]:0;  
 - nRet = (int)((WORD)chOffset1-(WORD)chOffset2);  
 - break;  
 - }  
 - TCHAR ch1 = *(lpText1+nText1IndexHandled);  
 - TCHAR ch2 = *(lpText2+nText2IndexHandled);  
 - if (isdigit(ch1)&&isdigit(ch2)) // if digit, change to number and compare  
 - {  
 - TCHAR* lpNum1 = new TCHAR[nText1Len];  
 - TCHAR* lpNum2 = new TCHAR[nText2Len];  
 - if (NULL==lpNum1||NULL==lpNum2)  
 - return 0;  
 - memset(lpNum1,0,nText1Len*sizeof(TCHAR));  
 - memset(lpNum2,0,nText2Len*sizeof(TCHAR));  
 - extractnumber(lpText1,nText1Len,nText1IndexHandled,lpNum1);  
 - extractnumber(lpText2,nText2Len,nText2IndexHandled,lpNum2);  
 - nRet = comparenumber(lpNum1,lpNum2);  
 - delete[] lpNum1;  
 - delete[] lpNum2;  
 - }  
 - else  
 - {  
 - nRet = (int)((WORD)ch1-(WORD)ch2);  
 - nText1IndexHandled++;  
 - nText2IndexHandled++;  
 - }  
 - if (nRet!=0)  
 - break;  
 - }  
 - return nRet;  
 - }  
 - TCHAR* extractnumber(TCHAR* lpBuf,int nLen,int& nIndexBegin,TCHAR* lpNumber)  
 - {  
 - if (NULL==lpBuf||NULL==lpNumber)  
 - return lpNumber;  
 - for (int i=nIndexBegin,nIndex=0;i<nLen;++i,++nIndexBegin)  
 - {  
 - TCHAR ch = *(lpBuf+i);  
 - if (!isdigit(ch))  
 - break;  
 - lpNumber[nIndex++]=ch;  
 - }  
 - return lpNumber;  
 - }  
 - int comparenumber(TCHAR* lpNumber1,TCHAR* lpNumber2)  
 - {  
 - if (NULL==lpNumber1||NULL==lpNumber2)  
 - return 0;  
 - int nNum1Len = _tcslen(lpNumber1);  
 - int nNum2Len = _tcslen(lpNumber2);  
 - int nMaxLen = max(nNum1Len,nNum2Len);  
 - TCHAR* lpFormatNum1 = new TCHAR[nMaxLen+1];  
 - TCHAR* lpFormatNum2 = new TCHAR[nMaxLen+1];  
 - if (NULL==lpFormatNum1||NULL==lpFormatNum2)  
 - return 0;  
 - memset(lpFormatNum1,_T('0'),nMaxLen*sizeof(TCHAR));  
 - memset(lpFormatNum2,_T('0'),nMaxLen*sizeof(TCHAR));  
 - lpFormatNum1[nMaxLen]=0;  
 - lpFormatNum2[nMaxLen]=0;  
 - int nPos = 0, nRet = 0;  
 - int nIndex = nMaxLen-1;  
 - for (nPos=nNum1Len-1;nPos>=0;--nPos)  
 - lpFormatNum1[nIndex--]=lpNumber1[nPos];  
 - nIndex = nMaxLen-1;  
 - for (nPos=nNum2Len-1;nPos>=0;--nPos)  
 - lpFormatNum2[nIndex--]=lpNumber2[nPos];  
 - for (nPos=0;nPos<nMaxLen;++nPos)  
 - {  
 - nRet = lpFormatNum1[nPos]-lpFormatNum2[nPos];  
 - if (nRet!=0)  
 - break;  
 - }  
 - delete[] lpFormatNum1;  
 - delete[] lpFormatNum2;  
 - return nRet;  
 - } 
 
  
  |  |    |  |   |  
  |   
 
 
 
 |