2011-11-19 36 views
0

我正在嘗試在C#中重寫TCL代碼。關注的代碼如下:在C#中對MatchCollection排序#

set list [regexp -all -inline -line {.+\d+.+\d+} $string] 

在這種情況下,正則表達式程序返回字符串中後,我整理該字符串列表基於最終數值的另一種表達所有匹配的列表的字符串:

set sortedList [lsort -decreasing -integer -index end $list] 

問題是,如何在C#中實現相同?我試過如下:

MatchCollection mc = Regex.Matches(inputString, regexPattern, RegexOptions.Multiline); 

但是正如我發現,我無法排序在C#中直接在matchcollection所以我複製每場比賽到一個數組:

string[] arrayOfMatches = new string[mc.Count]; 

for (int i = 0; i < mc.Count; i++) 
{ 
arrayOfMatches[i] = mc[i].Groups[1].Value; 
} 

然而,當我嘗試將arrayOfMatches排序數組,我沒有看到可用的排序方法。我錯過了什麼,我正朝着正確的方向前進?謝謝!

回答

1

The Array.Sort() method是靜態的,所以你要這樣稱呼它:

Array.Sort(arrayOfMatches, comparison); 

哪裏comparison要麼是一個委託,它可以比較兩個字符串或IComparer<T>的實現,可以做同樣的。

但它可能是更容易使用LINQ:

var matches = 
    from Match m in mc 
    let value = m.Groups[1].Value 
    let numericValue = int.Parse(value) 
    orderby numericValue descending 
    select value; 

這是假設整個value是多少。如果我正確理解了你並且你想從字符串的末尾得到一個數字值,那麼你必須添加代碼才能做到這一點。

+0

非常感謝大家!我是C#的新手,所以我必須仔細閱讀它,但我非常感謝您的所有輸入! – cake

+0

我用了一個委託。非常感謝! – cake

2

要對數組排序,請使用靜態Array.Sort()方法。也就是說,要對匹配進行排序,您需要定義一個IComparer。也許更簡單的方法是使用一點linq-fu:

var mc = Regex.Matches(input, patter); 
var matches = new Match[mc.Count]; 
mc.CopyTo(matches, 0); 
var sorted = matches 
    .Select(x => x.Groups[1].Value) 
    .OrderBy(x => x); 

排序將是groups數組中按升序排序的第2項的值。它的工作原理是.Select創建你想要的投影,並且.OrderBy對堆棧進行排序。

+1

'Array.Sort()'有一個接受'Comparison '委託的過載,並且你可以傳遞一個lambda。 – svick

+0

非常感謝大家!我是C#的新手,所以我必須仔細閱讀它,但我非常感謝您的所有輸入! – cake