같은 값인데 index 범위가 넘었다는 에러가 뜹니다ㅠ

안녕하세요.

항상 많은 도움을 주셔서 감사합니다.

이전 질문에서 도움주신 방식으로 하였는데도 불구하고 아직 해결이 안되어 도움좀 요청드립니다.

String str = “S1=001;S2=D1;S3=999;S4=960;”;
var result = str.TrimEnd(’;’)
.Split(’;’)
.Select(x => x.Split(’=’))
.Select(x => (Key: x[0], Value: x[1]));
foreach (var v in result)
{
LogWrite($“Key = {v.Key}, Value = {v.Value}”);
}

위에 str 변수에 값을 강제로 입력하면 잘 되는데,
넘어오는 값을 str에 넣으면 index범위가 벗어났다는 오류가 뜹니다.(굵게 표시한 곳에서 오류가 납니다)
넘어오는 값을 로그를 찍어보면 str에 강제로 주었던 값이랑 같은데 말이죠…

무엇이 문제일까요?..

좋아요 5

디버깅을 하실 때는 메서드 체이닝 방식 말고 하나씩 쪼개서 따로따로 호출하시면서 변수에 담아보시면 값을 아실 수 있습니다.

var로 받아가시면서 디버깅 해보시는 걸 추천드려요.

좋아요 4

A=B 형태가 아닐 경우 관련 오류가 날 수 있습니다.

좋아요 5

@Vincent 님, @dimohy 님 두분 말씀처럼 예시로 들어주신 문자열 포맷이 아닌 경우 문자열 나누기가 제대로 동작하지 않아 발생한 이슈로 추정 됩니다.
포맷이 안 맞는 경우를 대비하여 2가지로 접근해 볼 수 있습니다.

포맷이 안 맞는 경우 무시

var result =
    str
        .Split(';', StringSplitOptions.RemoveEmptyEntries)
        .Select(x => x.Split('=', StringSplitOptions.RemoveEmptyEntries))
        .Where(x => x.Length == 2)
        .Select(x => (Key: x[0], Value: x[1]));

포맷이 안 맞는 경우 로그를 남기고, 보완 처리

var result =
    str
        .Split(';', StringSplitOptions.RemoveEmptyEntries)
        .Select(x => x.Split('=', StringSplitOptions.RemoveEmptyEntries))
        .Select(x =>
        {
            if (x.Length == 2)
            {
                return (Key: x[0], Value: x[1]);
            }

            // 필요한 경우 로그를 남깁니다.
            if (x.Length == 1)
            {
                return (Key: x[0], Value: string.Empty);
            }

            return (Key: string.Empty, Value: string.Empty);
        });

서비스 시나리오에 맞춰 선택하시면 될 것 같습니다.
위 예시들은 ;(세미콜론) 포맷 마저 안 맞는 경우를 배제하고 있습니다.
세미콜론 포맷도 안 맞는 경우는 Split과 Select 사이에 보완 코드를 넣어 처리해주시면 될 것 같습니다.

좋아요 4

엇…질문 올리신 분은 @상식이 님이신데 저를 태그 하신 이유가…

좋아요 2

포맷이 안 맞는 경우를 암시 하는 것 같아서 태그 달았는데 잘못 했나 봐요 :sweat_smile:

좋아요 3

아…저는 일단 부끄럽게도 거기까지 생각은 안하고… (질문자님께서 올려주신 코드를 테스트 해보지 않았습니다 ㅠㅠ)

Linq를 메서드 스타일로 쓸 때 메서드 체이닝을 안하고 하나씩 쓰다보면 디버깅이 편하니까 그런 부분을 말씀드린 것입니다…ㅋㅋ

나는 답을 알고 있는데 그걸 메서드 체이닝해서 디버깅하면 알 수 있을거다 등의 메세지는 담지 않았습니다 ㅋㅋ

(안해본 게 문제였군요)

그러고보니 예제 코드를 올려주셨는데 테스트해보지 않고 답변을 달았던 것은 저의 실수였던 것 같습니다.

질문자님과 답변주신 다른 분들께 사과드립니다!

좋아요 3