2017-12-19 24 views
0

내가 결과는 길이 2의 배열 대신 두 개의 새로운 빈 문자열 것으로 예상 추가 추가됩니다.가입 ClientAPI.COLUMN_DELIMITER하여 문자열 다음 동일한 구분에 의한 분할 내가</p> <p><code>string.Join(ClientAPI.COLUMN_DELIMITER),(new string[] {"1", "2" })).Split(ClientAPI.COLUMN_DELIMITER.ToCharArray())</code></p> <p>다음 한 두 개의 새로운 요소

왜 이런 일이 발생하며 Join 메서드에서이를 피할 수 있습니까? (나는 Split에 대한 통제권이 없다).

string join and split

편집

enter image description here

+2

[RemoveEmptyEntries] (https://msdn.microsoft.com/en-us/library/system.stringsplitoptions (v = vs.110) .aspx) –

+0

@AFriend를 나눌 때 나는 스플릿을 제어하지 않았습니다. 게다가 문자열 [] *은 제거해서는 안되는 다른 빈 문자열을 포함 할 수 있습니다. – user7518s

+1

그게 무슨 뜻인지 모르겠다. 그리고 이것을 더 읽기 쉬운 줄로 나누지 않고 직접 디버깅하는 것이 어떻습니까? 단계별로 다른 값을 검사하십시오. –

답변

4

왜 이런 일이 발생합니까? String.Split Method (Char[])에 대한

문서는 우리에게 : 분리의

각 요소는 별도의 구분 문자를 정의합니다. 두 개의 구분 기호가 인접, 또는 구분이 인스턴스의 시작 또는 끝 부분에서 발견되면, 반환 된 배열의 해당 요소는 (때문이 아니라 당신이 당신의 결과 배열에 빈 문자열을 가지고 왜 그

빈 포함 주석에 쓴 것처럼 Join 메소드의).

편집 :

string.Join("~|~", new string[] { string.Empty, "2" }).Split(new string[] { "~|~" }, StringSplitOptions.None) 

편집-2 : 이 시도 :

string.Join(ClientAPI.COLUMN_DELIMITER, new string[] { string.Empty, "2" }).Split(ClientAPI.COLUMN_DELIMITER, StringSplitOptions.None); 
+0

해결 방법이 있습니까? 구분 기호는 변경하지 않아야합니다. – user7518s

+0

@ user7518s 내 대답을 편집했습니다. 나는 그것이 당신을 도울 것이기를 바랍니다. – wygu

+0

'StringSplitOptions.None'을 추가하기 전과 똑같은 결과를 얻었습니다. – user7518s

0

그냥 사용 StringSplitOptions.RemoveEmptyEntries

string.Join(new string(ClientAPI.COLUMN_DELIMITER.ToCharArray()), (new string[] { "1", "2" })) 
.Split(ClientAPI.COLUMN_DELIMITER.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 

편집

원래 빈 문자열을 반환 할 수 없습니다. 왜냐하면 어느 것이 원래인지 모르기 때문입니다. 어쩌면 빈 문자열을 "패턴"으로 분할하기 전에 빈 문자열을 대체 한 다음 빈 문자열을 다시 복원하는 동안 빈 문자열로 대체 할 수 있습니다.

string pattern = "emptystringpattern"; 
string seperator = "||"; 
string[] input = new string[] { string.Empty,"1" }; 
for (int i = 0; i < input.Length; i++) 
{ 
    if (input[i] == string.Empty) 
    { 
     input[i] = pattern; 
    } 
} 

string joinedInput = string.Join(seperator, input); 
var splits = joinedInput.Split(seperator.ToCharArray(),StringSplitOptions.RemoveEmptyEntries); 

for (int i = 0; i < splits.Length; i++) 
{ 
    if (splits[i] == pattern) 
    { 
     splits[i] = string.Empty; 
    } 
} 

또한 pattern에는 구분 기호가 포함되어서는 안됩니다.

또 다른 옵션은 분할 전과 분할 과정 후에 빈 문자열의 수를 얻을 수 있다는 것입니다. 계산에 따라 다시 배열을 추가 할 수 있습니다.

+0

빈 항목을 제거하면 안됩니다. "결합"방법으로 추가 된 항목 만 제거하면됩니다. 입력 배열이'new string [] {string.Empty, 2 "}' – user7518s

+0

인 경우 결과는 무엇입니까?"Join "이 빈 문자열을 추가하는 이유는 무엇입니까? 실제 출력과 예상 출력을 공유하십시오. – lucky

+0

질문이 업데이트되었습니다. 예상되는 출력은 분명 입력 배열입니다. – user7518s

4

문제를 코드가 있다는 것입니다 함께이 예와 은 분할 방법은 "입력"배열을 돌려 준다 String.Split 메소드에 문자 배열을 지정합니다. 이제 당신은 주어진 캐릭터의 어떤 곳에서든 원래의 문자열을 나누고 싶다고 생각합니다. '~'과 '|'.

테스트 문자열이 "~ | ~ 1"이므로 '~', '|'의 세 구분자를 찾습니다. 및 '~'을 다시 누릅니다.세 개의 분리 문자는 결과적으로 네 개의 문자열을 의미하므로 세 개의 빈 문자열을 의미합니다.

joined_input.Split(new string[] { ClientAPI.COLUMN_DELIMITER }, StringSplitOptions.None)

을 (.ToCharArray없이)

당신 경우 : 당신이 호출하여 수행 할 수있는 전체 문자열로 | "~ ~"당신이 정말로으로 분할되었다 할 의도 무엇

빈 항목을받지 않으려면 StringSplitOptions.RemoveEmptyEntries을 사용할 수도 있습니다.