2010-12-06 92 views
2

我正在根據從客戶端瀏覽器發送的排序字段集合對數據集進行一些自定義篩選和排序,並且正在使用Dynamic Linq來實現(大部分)所需的效果。在遇到問題時,我嘗試按字符串類型進行排序,該字符串既包含傳統字符串又包含以字符串形式存儲的數字。看起來我不能傳入StringComparison枚舉值,或者爲Dynamic Linq orderby函數指定IComparer參數。動態Linq:如何指定StringComparison類型?

我排序的代碼如下所示:

myList.AsQueryable().OrderBy("StringColWithNums ASC") 

我結束了:

1 
10 
100 
11 
12 
2 
20 

代替:

1 
2 
10 
11 
12 
20 
100 

任何人有任何做類似的經歷嗎?

回答

0

看來這不是可以用動態Linq開箱即可完成的事情,至少在.NET 2.0/3.5中不是這樣。我最終修改了動態Linq源代碼以完成我所需要的。

1
myList.AsQueryable().Sort((r, s) => int.Parse(r).CompareTo(int.Parse(s))); 

會採取一些調整,如果這些都是對象,只是使用int.Parse(r.StringColWithNums),或任何字段。

哎呀,對不起,沒看過的所有OP看到它有字母也和你想要的動態LINQ,編輯

編輯

我不知道你會能夠使用動態LINQ和傳遞IComparer來實現這一點。在獲得結果後你可以做到這一點(例如,我最初正在編寫此類文章並進行修改)。評論你是否想追求這條路線。

0

這是一個嘗試在字符串比較中執行數字比較的根本問題。一對夫婦的方法,我會做到這一點:

  • 當加載列表中,用零的量將伴隨最大字符串大小,即String.Format("000000", number)前綴號碼。這隻有在你主要關心排序而不關心結果外觀的時候纔會起作用 - 即使這樣,你也可以將「000010」轉換回數字並調用ToString()方法再次顯示數字而不用前導零。

  • 寫自己的排序依據的實現(擴展方法),其中傳遞函數(或匿名函數)作爲參數的結果調用傳遞的方法進行重新排序。

0

可以解決這通過編寫一個新的字符串比較器

class AlphaNumericComparer : IComparer<string> 
     { 
      public int Compare(string x, string y) 
      { 
       // if both values are integers then do int comparision 
       int xValue, yValue; 
       if (int.TryParse(x, out xValue) && int.TryParse(y, out yValue)) 
        return xValue.CompareTo(yValue); 

       return x.CompareTo(y); // else do string comparison 
      } 
     } 

然後你就可以使用比較器像排序依據的方法和排序

var sorted = lst.OrderBy(s => s, new AlphaNumericComparer()); 

lst.Sort(new AlphaNumericComparer()); 

這會給你想要的結果。如果不是,那麼只需調整比較器即可。

+0

我不認爲你可以使用字符串比較器與動態LINQ雖然,我沿着這條道路,並沒有得到它去。 – BlackICE 2010-12-10 14:31:08