2011-03-01 76 views
0

我正在嘗試構建linq表達式來解決我的問題。我有一個字符串解析字符串和解析值的順序

List<string> arr = new List<string>(); 
arr.Add("<desc><ru>1</ru><en>3</en></desc>"); 
arr.Add("<desc><ru>2</ru><en>4</en></desc>"); 

我要分析每一個項目和訂單的列表導致

fake sample: 
arr.Select(ParseItem("en")).OrderBy(x) 

然後我們在RU兩個項目,以1,2

感謝所有和抱歉我的英文不好 感謝所有回覆,但是如何將結果轉換爲IQueryable

class Test { public string data { get; set; } } 
List<Test> arr = new List<Test>(); 

arr.Add(new Test { data = "<desc><ru>AAA</ru><en>One</en></desc>" }); 
arr.Add(new Test { data = "<desc><ru>1</ru><en>Two</en></desc>" }); 
arr.Add(new Test { data = "<desc><ru>22</ru><en>Ab</en></desc>" }); 
IQueryable<Test> t = arr.AsQueryable(); 

// here the trouble how to convert to IQueryable<Test> 
t = t.Select(s => XElement.Parse(s.data)).Select(x => x.Element("en")). 
OrderBy(el => el.Value); 

再次感謝

+0

不清楚爲什麼你給出的代碼會用'ru'做任何事情......或者你用你給出的表達式做什麼(無論如何,就參數而言)是無效的。 – 2011-03-01 10:04:22

+0

你不能使用XML而不僅僅是裸露的字符串嗎?它會根據'XDocument'開放很多可能性。 – Bazzz 2011-03-01 10:04:41

+0

@Jon Skeet感謝您的迴應,我的輸入參數是女士,我想對某些函數進行分析,然後得到之間的一部分字符串,以及在最後我想排序的所有結果... – 2011-03-01 10:07:41

回答

2

問題更新後 - 這將<en>節點值恢復您的訂購數據:

var result = arr 
    .OrderBy(t=> 
     XElement.Parse(t.data).Element("en").Value 
    ); 

結果可修改爲IOrderedEnumerable<Test>類型。

+0

嗨,謝謝,如何返回不臨時項目,但原來的IQueryable t = arr.AsQueryable(); t = t.Select(s => XElement.Parse(s))。Select(x => x.Element(「en」))。OrderBy(el => el.Value); – 2011-03-01 10:32:20

+0

@Sanja Melnichuk:更新了我的答案 – Alex 2011-03-01 11:10:19

2

這將生成ru標記中的值的列表(假設它們是整數),按en標記中的值排序(再次假設爲整數)。

List<string> items = arr.Select(s => XElement.Parse(s)) 
         .OrderBy(xml => (int)xml.Element("en")) 
         .Select(xml => (int)xml.Element("ru")) 
         .ToList(); 

如果你只是想一一列舉,則可以省略ToList電話:

foreach (var item in arr.Select(s => XElement.Parse(s)) 
         .OrderBy(xml => (int)xml.Element("en")) 
         .Select(xml => (int)xml.Element("ru"))) 
{ 
    // do something with item 
} 
+0

謝謝你能讀我的編輯問題 – 2011-03-01 10:49:26

1

我不知道我有例外的結果是什麼,但如果你需要在en由值ru責令選擇值,那麼這就是:

var orderedItems = (
    from item in arr 
    let x = XElement.Parse(item) 
    let ruValue = (int)x.Element("ru") 
    let enValue = (int)x.Element("en") 
    orderby ruValue 
    select enValue 
    ).ToList(); 
0

我不知道它是否爲時已晚,但如果你想分析文本,如果它是一個整數,然後按值排序,否則按文本排序,那麼這可能會有所幫助。

您需要定義這樣的功能,使分析在LINQ表達式:

Func<string, int?> tryParseInteger = text => 
{ 
    int? result = null; 
    int parsed; 
    if (int.TryParse(text, out parsed)) 
    { 
     result = parsed; 
    } 
    return result; 
}; 

然後,你可以做的查詢是這樣的:

var xs = new [] { "Hello", "3ff", "4.5", "5", }; 
var rs = 
    (from x in xs 
    select tryParseInteger(x)).ToArray(); 
// rs == new int?[] { null, null, null, 5, }; 

在你的情況,你可能想是這樣的:

var elements = new [] 
{ 
    "<desc><ru>AAA</ru></desc>", 
    "<desc><ru>1</ru></desc>", 
    "<desc><ru>42</ru></desc>", 
    "<desc><ru>-7</ru></desc>", 
    "<desc><ru>BBB</ru></desc>", 
    "<desc><ru>22</ru></desc>", 
}; 

var query = 
    from e in elements 
    let xe = XElement.Parse(e) 
    let v = xe.Element("ru").Value 
    orderby v 
    orderby tryParseInteger(v) 
    select v; 

這將使你:

{ "AAA", "BBB", "-7", "1", "22", "42" } 

如果你想治療非整數(即解析爲空值)爲零,然後使用該行更改查詢:

orderby tryParseInteger(v) ?? 0 

然後你會得到這樣的:

{ "-7", "AAA", "BBB", "1", "22", "42" } 

我希望這有助於。