2013-10-08 6 views
0

Я получаю данные запроса в ASP.NET C#, и мне нужно как его строковое значение, так и значение int.Parse (если оно может быть проанализировано). (В примере я пропуск проверки нулевых значений, поскольку это не имеет никакого влияния на мой вопрос)TryParse in if condition

value = Request.QueryString["value"]; 
id = int.TryParse(Request.QueryString["value"], out id) 

выше код делает то, что мне нужно, но я только что получил интересно, если я мог бы написать это в одном предложении, так что я попытался это:

if (int.TryParse(Request.QueryString["value"], out id))) value=Request.QueryString["value"]; 

в этом случае я не получаю строковое значение, если оно не может быть разобрано, но я получить его разобранное значение.

Любые предложения? У меня нет проблем с моим кодом. Я просто спрашиваю из любопытства, что если это можно сделать в одной строке кода.

+5

«TryParse» в значительной степени предназначен для перехода в условие 'if', поскольку он возвращает' bool'. Ваш пример присвоения 'TryParse' значению' id' является бессмысленным. Не преследуйте ошибочность однострочного/сжатого кода. Сделайте свой код понятным и понятным для следующего разработчика, тот, кто должен исправить ваш код. –

+1

это не должно работать .. int.TryParse возвращает bool, первый раздел кода не имеет для меня никакого смысла. –

+1

Возможно, это только я, но ваши два набора кода не имеют смысла как «альтернативы», а TryParse возвращает bool, поэтому зачем присваивать ему id, который также получает вашу ценность ...? – crashmstr

ответ

2

почти -он лайнер версия будет

// id and value still need to be defined, of course! 
int.TryParse(value = Request.QueryString["value"], out id) 

Ваш код не должен работы: если id является a int он не сможет провести bool, исходя из TryParse.

+0

Хотя вы правы, я не могу удержаться, чтобы указать, что ваш код будет быть таким увлекательным, чтобы отлаживать, если что-то пошло не так в этом модуле, и вам придется найти причину :) –

+0

Я не упоминал о том, что я бы * никогда не писал код таким образом и настоятельно советовал бы против этого стиля. .. но ОП попросил однострочный, так что вот оно. – Alex

3

Вы можете это,

int id; 
string value = int.TryParse(Request.QueryString["value"], out id)) ? Request.QueryString["value"] : null; 
+1

Вам все равно нужно объявить переменную 'id', поэтому она не может быть выполнена в одной строке. –

+0

@ MikaelÖstberg, да, вы на 100% правильны – Satpal

+0

хорошо Я не имел в виду декларации, поэтому этот код, похоже, был тем, что я искал –

0

Нет, вы не (хотите) делать задание в условных.

Кроме того, если вы назначаете его value, то для эффективности вы должны использовать value.

value = Request.QueryString["value"]; 
id = int.TryParse(value, out id) 

И, наконец, вы уверены, что о id? Вы назначаете его логическому возврату TryParse, но также назначаете его ему. Я думаю, что ваш код неверен, хотя вы говорите, что это хорошо.

Я предполагаю, что вы имели в виду, чтобы сделать это:

var value = Request.QueryString["value"]; 
int id = -1; 
if(int.TryParse(value, out id)) 
    /* Do work here */ 
0

Вы не можете объявить все на одной строке, но если у вас есть несколько переменных int, вы можете разрешить их все на одной строке.

Замечание: Если int.TryParse fail на самом деле устанавливает параметр out в 0, с параметрами, которые необходимо назначить перед тем, как покинуть метод, поэтому я предполагаю, что именно поэтому.

например:

private void test() 
{ 
    int id, id2, id3 = int.MinValue; 

    string value1 = int.TryParse(Request.QueryString["value1"].ToString(), out id) ? Request.QueryString["value1"].ToString() : null; 
    string value2 = int.TryParse(Request.QueryString["value2"].ToString(), out id2) ? Request.QueryString["value2"].ToString() : null; 
    string value3 = int.TryParse(Request.QueryString["value3"].ToString(), out id3) ? Request.QueryString["value3"].ToString() : null; 
} 
1

выходные переменные Инлайн поддерживаются C# 7.0 (выпущен в марте '17)

var value = int.TryParse(Request.QueryString["value"], out int id) ? Request.QueryString["value"] : null; 

идентификатор (выходной переменной) будет содержать разобранное значение или значение по умолчанию (INT)