анонимная функция в ошибке запроса LINQ - PullRequest
2 голосов
/ 01 сентября 2011

Вот код, который я пытаюсь реализовать:

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 ]

5 голосов
/ 01 сентября 2011

Выражения запроса не поддерживают этот синтаксис.

Вы должны позвонить OrderBy напрямую:

var query = data.OrderBy(line => { ... });
3 голосов
/ 01 сентября 2011

Чтобы ответить на ваш вопрос «есть ли лучший путь», как насчет этого: поскольку счет, по-видимому, всегда представляет собой одну цифру (возможно, перед -), мы можем использовать регулярное выражение, чтобы вывести счет, определить переменная диапазона с 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.

...