같은 값인데 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개의 좋아요