2017-04-14 94 views
-4

我在排序列表中有數千個時間記錄。 他們是在格式:字符串比較C#

public static string mTimeFormat = "yyyyMMdd_HHmmss_fff"; 

名單按時間順序進行排序。 我從列表中檢索一系列記錄。所得的範圍爲2倍:t1和t2,它工作正常...

string t1 = startTime.ToString(mTimeFormat); 
string t2 = endTime.ToString(mTimeFormat); 
List<string> results = fileNameList.FindAll(s => (String.Compare(s, t1, true) > 0) && (String.Compare(s, t2, true) < 0)); 

現在,如果將我的時間記錄的末尾添加一個隨機數,我比較/檢索仍然工作...根據我對字符串比較的瞭解,它會打破比較......是吧?

+5

嗯...你不能只在測試用例中添加一些數據並自己想出來嗎?你沒有測試版本的應用程序和一些測試數據?在發佈之前,你真的應該學會在自己的事情上做些努力。如果您的互聯網連接斷開會發生什麼?你是否坐下旋轉拇指直到它回來? –

+0

哦,人性!通過轉換爲字符串比較'DateTime'充滿危險。 'DateTime'結構可以直接比較。閱讀MSDN文檔。 – radarbob

回答

1

好吧,讓我們試試另一個。直接從MSDN

如果兩個字符串比較等於一個字符串的結束,另一個字符串已經剩餘字符,然後用剩餘的字符的字符串被認爲是更大的

因此,你的第一個如果s長於t1且其餘字符相同,則比較(String.Compare(s, t1, true) > 0)將返回true。否則,如果st1的長度相同,則只有s的排序較高時,比較纔會返回true。但是,您的第二個比較(String.Compare(s, t2, true) < 0)不應受到影響。

TL;博士:是的,添加一個隨機字符可以,最終將破壞你的系統,但只有在st1正是除了隨機字符相同的情況。

-1

如果您確實在字符串的末尾添加了一個隨機字符,難道您只是使用String.Substring

public static string mTimeFormat = "yyyyMMdd_HHmmss_fff"; 

string t1 = startTime.ToString(mTimeFormat); 
string t2 = endTime.ToString(mTimeFormat); 
List<string> results = fileNameList.FindAll(s => (String.Compare(s.Substring(0, mTimeFormat.Length), t1, true) > 0) && (String.Compare(s.Substring(0, mTimeFormat.Length), t2, true) < 0)); 

這將截斷字符串t1t2如果它們比格式字符串的時間,從而完全繞過這個問題。

+0

這個問題並沒有要求解決一個問題(到目前爲止不存在的問題)。這是關於排序行爲的一個具體問題。 –

1

我會建議,即使它確實有效,它也是錯誤的方法。大多數情況下,將其他信息添加到旨在用於不同目的的字段中是錯誤的。它使代碼非常脆弱,難以維護。大多數專業開發人員不會考慮這樣做。

取而代之,創建一個包含必要信息的類 - 它現在看起來是一個字符串值,而某個類型的字段表示隨機數。隨着需求的變化,您現在可以隨時隨地輕鬆地向該課程添加其他功能。

該類還應該實現IComparable或實現IComparer的類以便使用比較方法。有關更多信息,請參閱此link