C # 구문-문자열을 쉼표로 배열로 분할, 일반 목록으로 변환 및 역순


92

이것에 대한 올바른 구문은 무엇입니까?

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

내가 뭘 망 쳤어? TSource는 무엇을 의미합니까?

답변:


253

문제는 당신이 전화하고 있다는 것입니다 List<T>.Reverse()있는 반환 void.

다음 중 하나를 수행 할 수 있습니다.

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

또는:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

후자는 더 많은 비용이 듭니다. 임의의 값 IEnumerable<T>을 되돌리려면 모든 데이터를 버퍼링 한 다음 모든 데이터를 생성하는 것이 포함되기 때문입니다. 반면에 List<T>모든 역방향 "인플레 이스"를 수행 할 수 있습니다. (여기서 차이점 Enumerable.Reverse<T>()List<T>.Reverse()인스턴스 메서드 대신 확장 메서드를 호출한다는 것 입니다.)

더 효율적이지만 다음을 사용할 수 있습니다.

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

이렇게하면 부적절한 크기의 버퍼가 생성되는 것을 방지 할 수 있습니다. 4 개의 명령문을 사용하는 대신 실제 사용 사례에서 성능 대비 가독성을 비교합니다.


25
스키트는 짐승이야!
육체

2
잘 정교하게, 정말 감사합니다!
Gaurav Aroraa

11

나는이 질문이 꽤 오래되었다는 것을 알고 있지만 내 문자열에 공백이 포함되어 있다는 점을 제외하면 비슷한 문제가 있습니다. 쉼표 이상으로 문자열을 구분하는 방법을 알아야하는 사람들을 위해 :

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

StringSplitOptions는 공백 문자 일 뿐인 레코드를 제거합니다.


이하지 않습니다 작업 대신 "톰 크루즈"단지 톰이 있다면
불타는


1

이 시도:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();

오류가 발생합니다. 'void'유형을 'System.Collections.Generic.List <string>으로 암시 적으로 변환 할 수 없습니다.
BuddyJoe

1

여기서 누락 된 것은 .Reverse ()가 void 메서드라는 것입니다. .Reverse ()의 결과를 변수에 할당 할 수 없습니다. 그러나 Enumerable.Reverse () 사용 순서를 변경하고 결과를 얻을 수 있습니다.

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

차이점은 Enumerable.Reverse ()가 void return 대신 IEnumerable <T>를 반환한다는 것입니다.


1

당신이 시도하는 경우

  1. 여러 구분 기호 사용
  2. 빈 문자열 필터링
  3. 선행 / 후행 공백 자르기

다음이 작동합니다.

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

산출

  • 크루즈
  • 스콧
  • 단발
  • ...에서

이제 다른 사람들이 제안한대로 분명히 순서를 바꿀 수 있습니다.

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