쉼표로 구분 된 문자열을 List <int>로 변환하는 방법


답변:


432

이를 수행하는 한 가지 방법이 있습니다.

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

11
그것은 또한 수List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog

2
에 대한 필요성이 new List<>있습니까?
LiquidPony

2
@LiquidPony no; ToList()대신 전화 할 수 있습니다 . 결과는 본질적으로 동일하다 : List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); 의 반환 값이 있기 때문에 당신은,하지만, 둘 중 하나를 할 필요가 Select()입니다 IEnumerable<>아니지만List<>
phoog

이 구현의 @LiquidPony는이 Select경우 확장이 반환 IEnumerable<Int32>되고 목록에 없으므로 yes 입니다. 그러나 list에는 다른 컬렉션을 소스로 허용하는 생성자가 있습니다.
Oybek

8
태그가 빈 문자열 인 경우를 처리하려면Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

24

간단한 유효성 검사를 포함하고 예외를 throw하는 대신 유효하지 않은 값을 건너 뛰려면 TryParse를 사용하는 것이 있습니다.

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

편집 : 다음은 Antoine의 피드백을 기반으로 업데이트 된 쿼리입니다. 먼저 TryParse를 호출하여 잘못된 값을 필터링 한 다음 구문 분석하여 실제 변환을 수행합니다.

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5

편집 2 : Charles Burns의 피드백 덕분에 C # 7.0에 대한 업데이트 된 쿼리입니다. 이 접근법으로 여분의 mos 변수를 제거하므로 조금 더 깔끔합니다.

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();

1
0이 하나의 합법적 인 입력 인 경우 실패!
앙투안 멜츠 하임

2
C # 7.0을 사용하면 모스의 선언을 생략 할 수 있습니다와 함께 TryParse 호출을 대체int.TryParse(m, out int _)
찰스 번스

14

W / 당신은 LINQ를 사용할 수 있습니다 int.Parse()을 변환 string[]IEnumerable<int>다음에 그 결과를 전달합니다 List<T>생성자를 :

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));

8

약간의 LINQ는 먼 길을갑니다.

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();

6

LINQ Query가 없으면이 방법을 선택할 수 있습니다.

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

그런 다음이 목록을 정수 유형으로 변환 할 수 있습니다 ...


사람이 익숙하지 = 그냥 메모는 .ToList<string>()여전히 필요using System.Linq;
빌 린슨


2

C # 3.5를 사용하는 경우 Linq를 사용하여이를 달성 할 수 있습니다.

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

또는 짧은 것

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();

2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

1

khalid13의 답변을 수정했습니다. 사용자가 "0"문자열을 넣으면 결과 목록에서 해당 문자열을 제거합니다. 나는 비슷한 것을했지만 익명의 객체를 사용했습니다.

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtection은 문자열이 null인지 보호하는 사용자 정의 함수입니다.

위의 작업은 오류없이 변환 할 수없는 문자열을 제거하는 것입니다. 변환에 문제가있는 경우 오류가 발생하면 수락 된 답변이 트릭을 수행해야합니다.


1

나는 이것을 우연히 발견했고 linq없이 내 자신의 솔루션을 공유하고 싶습니다. 이것은 원시적 접근법입니다. 정수가 아닌 값도 목록에 추가되지 않습니다.

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

도움이 되었기를 바랍니다.


-2

간단 해. 먼저 줄을 나눕니다. 쉼표 (,) 뒤에 공백을 제거하십시오. 그런 다음 시스템 정의 ToList ()를 사용하십시오.

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

','뒤의 공백을 제거하고이 쉼표로 구분 된 텍스트를 List로 변환

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.