以下是我正在尝试实施的代码:
var query = from line in thedata
orderby () => {
int a = line.IndexOf("Score=\"");
if (line[a + "Score=\"".Length + 1] == '-') {
return
int.Parse(line[a + "Score=\"".Length + 1].ToString()
+ line[a + "Score=\"".Length + 2]);
}
return int.Parse(line[a + "Score=\"".Length + 1].ToString());
}
select line;
其中thedata
是字符串列表。
编译器在orderby
上显示错误(无法推断类型参数)。如何重写此函数以解决此错误?作为一个侧面点,是否有更好的方法在这种情况下获得负数?
答案 0 :(得分:5)
查询表达式不支持该语法。
您应该直接致电OrderBy
:
var query = data.OrderBy(line => { ... });
答案 1 :(得分:3)
要解决你的“有更好的方法”问题,请问如何:由于分数显然总是一个数字(可能前面有-
),我们可以使用正则表达式来取出分数,用let
定义一个范围变量,然后按它排序:
// With a positive look-behind assertion for Score="
// Capture:
// an optional minus
// then
// a digit
Regex score = new Regex("(?<=Score=\")-?\\d");
string[] thedata = new[] { "Score=\"5\"", "Score=\"-2\"" };
var query = from line in thedata
let scoreAsString = score.Match(line).Value
orderby int.Parse(scoreAsString)
select line;
foreach (var outputLine in query)
{
Console.WriteLine(outputLine);
}
产生
Score="-2"
Score="5"
正面后瞻断言(?<=Score=\")
表示只考虑匹配前一个文本是Score="
;但是,只有可选的-
和数字实际上会被捕获到Match
中。