在C#中对MatchCollection进行排序

时间:2011-11-19 15:48:40

标签: c# arrays regex sorting tcl

我正在尝试用C#重写TCL代码。关注的代码如下:

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

在这种情况下,regexp过程返回字符串中所有匹配项的列表,之后我根据字符串末尾的数值对另一个表达式排序此字符串列表:

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数组进行排序时,我没有看到Sort方法可用。我错过了什么,我正朝着正确的方向前进?谢谢!

2 个答案:

答案 0 :(得分: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);

Sorted将是groups数组按升序排序的第2项的值。它的工作原理是.Select创建你想要的投影,然后.OrderBy对堆栈进行排序。

答案 1 :(得分: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是数字。如果我理解正确并且您想从字符串的末尾获取数值,则必须添加代码才能执行此操作。