Как я могу преобразовать разделенную запятыми строку в список <int>


201
string tags = "9,3,12,43,2"

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

Это не работает, потому что метод split возвращает строку []



Ответы:


435

Вот один из способов сделать это:

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 нет; вы могли бы позвонить ToList()вместо этого; результат по сути тот же: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); вам нужно сделать одно или другое, потому что возвращаемое значение Select()является IEnumerable<>, но неList<>
phoog

@LiquidPony в этой реализации да, так как Selectрасширение в этом случае возвращает IEnumerable<Int32>и его нет в списке. Однако в списке есть конструктор, принимающий другую коллекцию в качестве источника.
Ойбек

8
Для обработки случая, когда теги являются пустой строкой, используйтеSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

25

Если вы хотите включить простую проверку и пропустить недопустимые значения (вместо создания исключения), вот что использует 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

РЕДАКТИРОВАТЬ: Вот обновленный запрос на основе обратной связи от Антуана. Сначала вызывается TryParse, чтобы отфильтровать все неверные значения, а затем Parse для выполнения фактического преобразования.

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: обновленный запрос для 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 вы можете опустить объявление mos и заменить вызов TryParse наint.TryParse(m, out int _)
Charles Burns

14

Вы можете использовать LINQ w / int.Parse()для преобразования в string[]a, IEnumerable<int>а затем передать этот результат в List<T>конструктор:

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


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();


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<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.