int.TryParse합성당
int.TryPrase모든 것이 훌륭하지만, 단 한가지 문제가 있습니다. 코드를 사용하려면 최소한 두 줄이 필요합니다.
int intValue;
string stringValue = "123";
int.TryParse(stringValue, out intValue);
....
물론 저는 다음과 같은 일을 할 수 있습니다.
string stringValue = "123";
int intValue = Convert.ToInt32(string.IsNullOrWhiteSpace(stringValue) ? 0 : stringValue);
한 줄의 암호로
어떻게 하면 마술을 부릴 수 있을까요?Parse에게 한 대의 라이너를 사용해 보십시오. 아니면 제3의 대안이 아직 있습니까?
감사합니다!
베즈든이 가장 잘 대답했지만 실제로는 Reddogs 솔루션을 사용할 계획입니다.
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
확장 방법을 사용할 수 있습니다.
public static class StringExtensions
{
public static int TryParse(this string input, int valueIfNotConverted)
{
int value;
if (Int32.TryParse(input, out value))
{
return value;
}
return valueIfNotConverted;
}
}
용도:
string x = "1234";
int value = x.TryParse(0);
편집: 그리고 그것이 당신의 희망이라면 당연히 기본값을 이미 0으로 설정한 명백한 오버로드를 추가할 수 있습니다.
이 답변은 C# 7 이상을 사용하는 분들만을 위한 것입니다.
이제 out 매개변수를 인라인으로 선언할 수 있습니다.
int.TryParse("123", out var result);
사용 예시:
if (int.TryParse("123", out var result)) {
//do something with the successfully parsed integer
Console.WriteLine(result);
} else {
Console.WriteLine("That wasn't an integer!");
}
MSDN: https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7#out-variables
저는 이것으로 확장 방법을 만들 것입니다.
public static int? AsInt32(this string s)
{
int value;
if (int.TryParse(s, out value))
return value;
return null;
}
정말 아름다운 것은 없다고 생각합니다만, 마음에 드시면 한 줄로 끝냅니다.
string stringValue = "123"
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
9년 된 질문에 마지막으로 한 가지 더 추가했습니다. :).파싱이 실패하면 기본값을 반환하지 않고 NULL을 반환하기 때문에 boool 파싱은 조금 다릅니다.이 줄은 이렇게 합니다. (C# 7 기준)
return bool.TryParse(value, out bool result) ? (bool?)result : null;
해당 결과 캐스트가 필요하며, 그렇지 않으면 두 반환 값의 서로 다른 유형을 조정할 수 없습니다.
StringExtensions 클래스를 확인합니다.AsInt(String, 문자열)이 포함되어 있습니다.문자열 변환을 시도하고 성공하지 못한 경우 문자열을 기본값으로 제공된 Int32 값으로 채우는 Int32) 확장 메서드입니다.
예:
var intValue = "123".AsInt(-1);
int val2 = "asd".AsInt(-1);
//Output : -1
int val3 = "123".AsInt(-1);
//Output : 123
당신은 필요합니다.System.Web.WebPages네임스페이스.
C# 7.0+에서는 인라인 변수 선언을 사용할 수 있습니다.
- 구문 분석이 성공한 경우 - intValue = 구문 분석된 값입니다.
- 구문 분석에 실패하는 경우 - intValue = 0.
코드:
int.TryParse(stringValue, out int intValue);
단점:
0 값과 구문 분석되지 않은 값을 구별할 수 없습니다.
당신은 그것을 만들고 싶지 않습니다.한 줄로 파스를 해보세요. 왜죠?입력 문자열이 유효한 정수가 아니면 intValue에 할당할 수 없기 때문입니다.TryParse()의 요점은 예외를 포착할 필요가 없는 대신 양호한 입력을 테스트하고 우아하게 저하시킬 수 있도록 하는 것입니다.
Int.TryParse()는 이미 바로 가기이므로 유효한 int를 테스트하고 두 단계로 작업을 수행할 필요가 없습니다.당신이 원하는 만큼의 것입니다.
기본적으로 두 가지 가치(성공과 가치)를 반환하기 때문에 두 가지 선이 필요합니다.
래퍼 클래스를 시도해 볼 수 있습니다.
void Main()
{
var result = simpleIntParser.TryParse("1");
if(result)
{
Console.WriteLine((int)result);
} else {
Console.WriteLine("Failed");
}
result = simpleIntParser.TryParse("a");
if(result)
{
Console.WriteLine((int)result);
} else {
Console.WriteLine("Failed");
}
}
public class simpleIntParser
{
public bool result {get; private set;}
public int value {get; private set;}
private simpleIntParser(bool result, int value)
{
this.result = result;
this.value = value;
}
public static simpleIntParser TryParse(String strValue)
{
int value;
var result = int.TryParse(strValue, out value);
return new simpleIntParser(result, value);
}
public static implicit operator int(simpleIntParser m)
{
return m.value;
}
public static implicit operator bool(simpleIntParser m)
{
return m.result;
}
}
유형이 모호할 경우(예: 콘솔의 경우) 캐스팅이 필요합니다.WriteLine())을(를) 입력하지만, 예를 들어 정수 파라미터로 전달하면 캐스팅이 필요하지 않습니다.
이것은 끈을 두 번 파싱하기 때문에 기술적으로 가장 효율적이지는 않지만, 한 줄로 묶기는 합니다.
과:Nullable<int>:
int? ToInt(string value) => int.TryParse(value, out _) ? int.Parse(value) : (int?)null;
언급URL : https://stackoverflow.com/questions/4620565/int-tryparse-syntatic-sugar
'programing' 카테고리의 다른 글
| 새로 추가된 입력 요소에 초점을 맞춥니다. (0) | 2023.09.12 |
|---|---|
| MariaDB 쿼리 JSON 결과는 텍스트 열에서 \\"라는 큰따옴표를 벗어납니다. (0) | 2023.09.12 |
| 리사이클러뷰를 사용하여 ListView를 대체해야 합니까? (0) | 2023.09.12 |
| 최대 스케일 느리고 연결 끊김 (0) | 2023.09.07 |
| $(문서.본문)과 $('본문')의 차이 (0) | 2023.09.07 |