LINQ查询错误中的匿名函数

时间:2011-09-01 14:08:53

标签: c# linq anonymous-function

以下是我正在尝试实施的代码:

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上显示错误(无法推断类型参数)。如何重写此函数以解决此错误?作为一个侧面点,是否有更好的方法在这种情况下获得负数?

2 个答案:

答案 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中。