2011-04-01 63 views
1


我有一個組合框來顯示我的數據庫(varchar)從我的數據庫。該數據總是「1,2,3,4,別人」,當我顯示的數據排序是這樣的:如何分類(1,11,12,2,所有,其他)至(全部,1,2,11,12,其他)?

1 
10 
11 
12 
2 
3 
4 
All 
Others 

如何使下拉的樣子:

All 
1 
2 
3 
4 
10 
11 
12 
Others 

OR

在SQL中,我嘗試ORDER BY CAST(priorityNum AS UNSIGNED INTEGER)之後,我將AllOther添加到我的數據表結果中。但是如何設置AllOthers總是首先和最後?

+0

顯示一些代碼。告訴我們你使用的是什麼語言。 – 2011-04-01 09:23:13

+1

問題是關於C# – user492238 2011-04-01 09:25:38

回答

1

是否有原因存儲爲varchar?它應該是一個整數,這將解決您的問題 - 併成爲您的存儲的正確類型

+1

但是這需要使用兩個特殊的整數來表示所有和其他值,或者(我更喜歡)表示這些情況的其他方式。 – reinierpost 2011-04-01 09:34:38

+0

當然,對特殊值的需求是使用「int」以外的其他東西的一個很好的理由。不知道'varchar'是否是最好的方法,但至少它可以完成工作。此外,這種評論應該作爲_註釋_發佈,而不是答案:你根本沒有回答這個問題。 – 2011-04-01 09:37:38

0

您需要一些特殊的比較方法。它應該檢查兩個字符串是否都是數字,然後使用它們的數字值進行比較。如果第一個值是全部或其他,第二個值是數字,則第一個值更小。如果第一個是All,第二個是其他,那麼第一個更小。

1

理想情況下,你可以使用類似列表(T)的.sort http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx#Y851

當你做出比較器,檢查是否值是一個int,如果是這樣,如果不把它比正常的, ,你知道你的所有/其他情況之一。然後您根據您正在處理的字符串返回一個值。這就是說,如果你只需要將數據整理到數據庫中,而不是放入All和Others中,然後在運行時將它們放入數據庫,就可以使整理更容易。

0

您應該從文本中單獨處理(排序)數字,然後重新構建列表。或存儲它不是一個單獨的字典排序的所有項目,FE:

All -> 0 
Other -> int.MaxVallue 

比你走過的無序列表,獨立非數量的項目(通過字典或Int.TryParse)從數字排序然後插入字典中的文本項。

聽起來很複雜,但準備更改這些非數字項目。

6

只要您的集合是IEnumerable,就可以使用自定義比較器方法調用OrderBy。 你比較器應該是這樣的:

class myStringComparer: IComparer<string> { 
    public int Compare(string a, string b) { 
     if (a == b) return 0; 
     if (a == "All" || b == "Others") return -1; 
     if (a == "Others" || b == "All") return 1; 
     return int.Parse(a) - int.Parse(b); 
    } 
} 

這一點,因爲,則將只是拋出一個異常,如果數據意外發現(別的不是「全部」,「其他」,或一個數字)。您可能希望在嘗試整數分析之前添加其他邏輯。

現在,您可以致電.OrderBy(new myStringComparer())在您的名單/收藏。請注意,OrderBy只適用於IEnumerable對象(這包括任何可以放在foreach循環中的任何東西,例如數組,列表等)。

+1

你需要切換你的「全部」|| 「其他」匹配。第一個應該返回-1,另一個1 :)你的方法首先排序其他人,最後一個。 – 2011-04-01 09:56:54

+0

謝謝你的收穫,現在就修好了。 – 2011-04-01 10:02:18

0

第一手資料,排序長度,然後價值,這將有11個解決你的問題之前2.

爲了您的兩個特殊的話來,你會需要一些魔法。

0

我通過在SQL註釋中使用CAST來解決它,並以編程方式將「All」和「Others」添加到我的數據表中。