2011-03-01 69 views
3

我有一個包含許多元素的Xelement。C#LINQ order by

我有下面的代碼對它們進行排序:

var calculation = from y in x.Elements("row") 
       orderby y.Element("BUILD_ORDER").Value 
       select new 
       { 
        calcAttribute = y.Element("ELEMENT").Value 

       }; 

的正常工作,直到BUILD_ORDER> 10,它下令10只1

後,如果我想在嚴格的數字順序,我將元素處理爲Int,這是否正確,或者LINQ是否具有內置擴展/方法?

orderby Convert.ToInt32(y.Element("BUILD_ORDER").Value) 
+0

看到這個:http://stackoverflow.com/questions/5093842/alphanumeric-sorting-using-linq-c/5093995#5093995 – 2011-03-01 16:22:48

回答

7

LINQ到對象沒有內置的轉換,但LINQ到XML的作用:

var calculation = from y in x.Elements("row") 
        orderby (int) y.Element("BUILD_ORDER") 
        select new 
        { 
         calcAttribute = y.Element("ELEMENT").Value 
        }; 

是否有任何理由爲什麼你使用匿名類型雖然,而不僅僅是選擇你想要的價值?例如:

var calculation = from y in x.Elements("row") 
        orderby (int) y.Element("BUILD_ORDER") 
        select y.Element("ELEMENT").Value; 

請注意,如果缺少BUILD_ORDER或ELEMENT子元素,這兩者都會引發異常。您可以修復使用轉換int?,而不是intBUILD_ORDER,以及轉換爲string爲元:

var calculation = from y in x.Elements("row") 
        orderby (int?) y.Element("BUILD_ORDER") 
        select (string) y.Element("ELEMENT"); 

如果BUILD_ORDER存在,但不能被解析爲當然的整數這仍然會失敗。

如果你的數據應該是總是有這些元素,第一種形式更好,因爲它會在早期檢測到任何數據錯誤。

+2

正如澄清,這是因爲的XElement有一個運算符爲Explict Casting重載類型int以及許多其他[XElement Operators](http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.op_explicit(v = VS。 90).aspx) – jbtule 2011-03-01 16:38:47

+0

爲什麼我沒有想到使用XElement的顯式投射行爲?這種事情就是爲什麼我不介意讓Skeeted。 :) – 2011-03-01 17:34:34

+0

感謝喬恩,我使用匿名類型的原因是我的原始代碼有一些值被提取,我需要使用。我還沒有改變代碼。就錯誤而言 - 我今天已經多次瞭解到了這些:)我從來沒有聽說過(int?),我會對此進行一下閱讀。謝謝你的偉大答案。 – 2011-03-01 17:45:01

2

對我很好。您也可以使用Int32.Parse(...)。我不知道任何內置的方法將字符串整理爲整數,但您肯定可以編寫自己的方法。

2

是的,因爲你的XML值不是類型化,你必須手動施放他們.NET能夠數字排序。

順便說一句,int.Parse會給你表現略好。

2

看起來像是將構建順序讀取爲字符串而不是int。你的樣品應該工作,或者嘗試

orderby int.Parse(y.Element("BUILD_ORDER").Value)