我正在尝试用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方法可用。我错过了什么,我正朝着正确的方向前进?谢谢!
答案 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
是数字。如果我理解正确并且您想从字符串的末尾获取数值,则必须添加代码才能执行此操作。