Это также может быть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, поэтому она немного чище.
Я внес изменение в ответ khalid13. Если пользователь введет строку «0», его ответ удалит его из полученного списка. Я сделал нечто подобное, но использовал анонимный объект.
var result = commaSeparatedString.Split(newchar[]{','},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.
Вышесказанное удаляет все строки, которые не удалось преобразовать без ошибок. Если вам нужна ошибка, если возникла проблема с конвертацией, тогда принятый ответ должен помочь.
Я наткнулся на это, и я просто хочу поделиться своим собственным решением без linq. Это примитивный подход. Нецелые значения также не будут добавлены в список.
List<int>TagIds=newList<int>();string[] split = tags.Split(',');foreach(string item in split){int val =0;if(int.TryParse(item,out val)==true){TagIds.Add(val);}}
Ответы:
Вот один из способов сделать это:
источник
List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
new List<>
?ToList()
вместо этого; результат по сути тот же:List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
вам нужно сделать одно или другое, потому что возвращаемое значениеSelect()
являетсяIEnumerable<>
, но неList<>
Select
расширение в этом случае возвращаетIEnumerable<Int32>
и его нет в списке. Однако в списке есть конструктор, принимающий другую коллекцию в качестве источника.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
Если вы хотите включить простую проверку и пропустить недопустимые значения (вместо создания исключения), вот что использует TryParse:
РЕДАКТИРОВАТЬ: Вот обновленный запрос на основе обратной связи от Антуана. Сначала вызывается TryParse, чтобы отфильтровать все неверные значения, а затем Parse для выполнения фактического преобразования.
Изменить 2: обновленный запрос для C # 7.0, благодаря обратной связи от Чарльза Бернса. Обратите внимание, что с помощью этого подхода мы избавляемся от дополнительной переменной mos, поэтому она немного чище.
источник
int.TryParse(m, out int _)
Вы можете использовать LINQ w /
int.Parse()
для преобразования вstring[]
a,IEnumerable<int>
а затем передать этот результат вList<T>
конструктор:источник
Немного LINQ проходит долгий путь:
источник
Без LINQ Query, вы можете выбрать этот метод,
и затем вы можете преобразовать этот список в целочисленный тип ...
источник
.ToList<string>()
все еще нуждаетсяusing System.Linq;
источник
.Select(x => x.Trim()
, так как Parse автоматически обрезает любые пробелы для вас.Если вы используете C # 3.5, вы можете использовать Linq для достижения этой цели
или короткий
источник
источник
Я внес изменение в ответ khalid13. Если пользователь введет строку «0», его ответ удалит его из полученного списка. Я сделал нечто подобное, но использовал анонимный объект.
TrimNullProtection - это пользовательская функция, которую я сделал, которая защищает, если строка имеет значение null.
Вышесказанное удаляет все строки, которые не удалось преобразовать без ошибок. Если вам нужна ошибка, если возникла проблема с конвертацией, тогда принятый ответ должен помочь.
источник
Я наткнулся на это, и я просто хочу поделиться своим собственным решением без linq. Это примитивный подход. Нецелые значения также не будут добавлены в список.
Надеюсь это поможет.
источник
Это просто. Сначала разбейте строку. Обрезать пробел после запятой (,). Затем используйте системный определенный ToList ()
Чтобы удалить пробел после ',' и преобразовать этот разделенный запятыми текст в список
источник