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

Ответы:

435

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

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
dasblinkenlight
источник
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();
khalid13
источник
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)));
Джастин Нисснер
источник
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;
Билл Роулинсон
4
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList();
Ойбек
источник
2
Согласно docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/… Вам не нужно добавлять .Select(x => x.Trim(), так как Parse автоматически обрезает любые пробелы для вас.
Филипп Квинлан
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();
LiquidPony
источник
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.

Вышесказанное удаляет все строки, которые не удалось преобразовать без ошибок. Если вам нужна ошибка, если возникла проблема с конвертацией, тогда принятый ответ должен помочь.

SolidSnake4444
источник
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);
    }
}

Надеюсь это поможет.

drchanix
источник
-2

Это просто. Сначала разбейте строку. Обрезать пробел после запятой (,). Затем используйте системный определенный ToList ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Чтобы удалить пробел после ',' и преобразовать этот разделенный запятыми текст в список

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Parag555
источник