Як можна перетворити розділений комами рядок у Список <int>


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

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

Це не працює, оскільки метод розділення повертає рядок []



Відповіді:


432

Ось один із способів зробити це:

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

11
Це теж могло бутиList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
понеділок

2
Чи є потреба в цьому new List<>?
LiquidPony

2
@LiquidPony немає; ви могли б зателефонувати ToList()натомість; результат по суті той самий: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); вам потрібно зробити те чи інше, хоча повернене значення Select()- це IEnumerable<>, але не -List<>
foog

@LiquidPony в цій реалізації так, оскільки Selectрозширення в цьому випадку повертається, IEnumerable<Int32>і воно не є списком. Однак у списку є конструктор, який приймає іншу колекцію як джерело.
Ойбек

8
Для обробки випадку, коли теги - це порожній рядок, використовуйтеSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

24

Якщо ви хочете включити просту перевірку та пропустити недійсні значення (замість того, щоб викидати винятки), ось що використовується 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

EDIT: Ось оновлений запит, заснований на відгуках від 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

Edit 2: оновлений запит на C # 7.0, завдяки відгукам Чарльза Бернса. Зауважте, що ми позбавляємося від додаткової мінливої ​​моди з таким підходом, тож вона трохи чистіша.

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

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

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


6

Без запиту LINQ ви можете вибрати цей метод,

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 - це спеціальна функція, яку я створив і захищає, якщо рядок є нульовим.

Згадане вище - це викреслити будь-які рядки, які не вдалося перетворити без помилок. Якщо вам потрібна помилка, якщо виникла проблема з перетворенням, то прийнята відповідь повинна зробити фокус.


1

Я натрапив на це, і просто хочу поділитися власним рішенням без зв'язку. Це примітивний підхід. Нецілі значення також не будуть додані до списку.

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.