줄을 한 줄에 모두 분할하고 자르려면 어떻게해야합니까?


124

이 줄을 나누고 싶습니다.

string line = "First Name ; string ; firstName";

트림 된 버전의 배열로 :

"First Name"
"string"
"firstName"

이 모든 것을 한 줄로 어떻게 할 수 있습니까? 다음은 "cannot convert type void"오류를 제공합니다.

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 

2
ForEach현재 인스턴스에서 작동 하고을 반환하므로 오류가 IEnumerable반환 void됩니다.
Majkel

답변:


291

시험

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

참고로 Foreach 메서드는 매개 변수에 대해 Action (T를 취하고 void를 반환)을 취하고 람다는 문자열을 문자열로 반환합니다.

Foreach 확장 메서드는 컬렉션 내의 개체 상태를 수정하기위한 것입니다. 문자열은 변경할 수 없으므로 효과가 없습니다.

그것이 도움이되기를 바랍니다; o)

세드릭


3
참고 : ForEach은 확장 방법이 아닙니다.
Guffa

Linq 최고의 솔루션!
Sonhja

값이 없으면 null을 반환합니까?
Demodave

line이 null이면 예외가 발생합니다. 줄에 ';'가 포함되지 않은 경우 trimmid 라인에 해당하는 문자열 하나가 포함 된 목록이 있습니다
Cédric Rup

22

ForEach메서드는 아무것도 반환하지 않으므로 변수에 할당 할 수 없습니다.

Select대신 확장 방법을 사용하십시오 .

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

5

p.Trim ()은 새 문자열을 반환하기 때문입니다.

다음을 사용해야합니다.

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

3

또는 이것을 시도하십시오 :

string[] parts = Regex.Split(line, "\\s*;\\s*");

이것은 좋은 생각이지만 문자열 끝에 후행 공백이 누락되었다고 생각합니다. 맞습니까?
jrichview

3

확장 방법은 다음과 같습니다.

    public static string[] SplitAndTrim(this string text, char separator)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }

        return text.Split(separator).Select(t => t.Trim()).ToArray();
    }

2

Regex를 사용해보십시오.

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();

0

분할은 string [] 유형을 반환합니다. 확장 메소드 작성 :

public static string[] SplitTrim(this string data, char arg)
{
    string[] ar = data.Split(arg);
    for (int i = 0; i < ar.Length; i++)
    {
        ar[i] = ar[i].Trim();
    }
    return ar;
}

나는 당신의 솔루션이 마음에 들었 기 때문에 그것에 추가하고 더 유용하게 만들기로 결정했습니다.

public static string[] SplitAndTrim(this string data, char[] arg)
{
    return SplitAndTrim(data, arg, StringSplitOptions.None);
}

public static string[] SplitAndTrim(this string data, char[] arg, 
StringSplitOptions sso)
{
    string[] ar = data.Split(arg, sso);
    for (int i = 0; i < ar.Length; i++)
        ar[i] = ar[i].Trim();
    return ar;
}

-1

정규식 사용

string a="bob, jon,man; francis;luke; lee bob";
			String pattern = @"[,;\s]";
            String[] elements = Regex.Split(a, pattern).Where(item=>!String.IsNullOrEmpty(item)).Select(item=>item.Trim()).ToArray();;			
            foreach (string item in elements){
                Console.WriteLine(item.Trim());

결과:

단발

남자

프랜시스

루크

남자 이름

단발

패턴 설명 [,; \ s] :,; 또는 공백 문자

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.