다음의 코드처럼 원하는 결과를 얻을 수 있습니다.
(ConsoleKey.Spacebar를 이용해서 처리하는 방법은 Console.ReadKey()
를 이용해 구현해야 해서 처리가 좀 더 복잡할 것 같습니다.)
| 소스코드 (.NET 6, C# 10 이용)
Console.Write("X, Y ? ");
var input = Console.ReadLine();
// 구분자를 이용하는 방법
var values = input!.Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Select(x =>
{
var bResult = int.TryParse(x, out var value);
return (Result: bResult, Value: value);
}).ToArray();
if (values.Length >= 2)
{
Console.WriteLine($"X: {values[0]}, Y: {values[1]}");
}
| 결과
X, Y ? 12 8
X: (True, 12), Y: (True, 8)
입력된 값이 정수가 아닐 수 있어서 관련된 처리를 하였습니다.
코드가 좀 복잡해 보일수도 있지만 하나하나 살펴보면,
input!.Split(new { ’ ', ‘,’ }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
문자열을 구분자로 나눠줍니다. 여기서는 ’ '(스페이스) 와 ‘,’(컴마)를 구분자로 사용하였습니다.
옵션을 붙였는데, StringSplitOptions.RemoveEmptyEntries
옵션은 빈값을 제거, 예를 들어
‘5,4,’ 라고 입력 했을 경우 마지막 ''빈 문자열을 제거해 줍니다.
StringSplitOptions.TrimEntries
옵션은 분리된 문자열을 트림 (공백제거) 합니다.
.Select(x =>
LINQ 메소드인데 분리된 문자열을 숫자로 변환하기 위함입니다. Select()
에 의해 원자(분리된 개별 문자열)를 순회하며 숫자로 변환해 줍니다.
var bResult = int.TryParse(x, out var value);
return (Result: bResult, Value: value);
순회하는 문자열을 int.TryParse()
해서 숫자로 변환하는데 변환에 실패한 것도 확인할 수 있도록 (Result, Value)
형태의 튜플로 반환합니다.
}).ToArray();
Select()
의 반환값은 IEnumerable<string>
이므로 인덱스로 접근할 수 있도록 배열로 변환합니다.
이 코드를 이해하기 위해서는 다음의 사전 지식이 필요합니다.
string.Split()
메소드 이해
Select()
LINQ 메소드 이해
ValueTuple
예) (Result: bResult, Value: value)
이해