Разбейте строку, преобразуйте ToList <int> () в одну строку


192

У меня есть строка, которая имеет номера

string sNumbers = "1,2,3,4,5";

Я могу разделить его, а затем преобразовать в List<int>

sNumbers.Split( new[] { ',' } ).ToList<int>();

Как я могу преобразовать массив строк в список целых чисел? Так что я смогу преобразовать string[]вIEnumerable


У нас был точно такой же вопрос сегодня: нажмите меня
Дарио

3
в «одной линии» очень сильное требование! </ Perl>
DFA

2
Этот вопрос, в частности, говорит, чтобы разбить строку чисел, что делает ответ простым. Вопрос, который Дарио упомянул, относится к проблемам TryParse для общих строк.
Goodeye

Ответы:



31

Вы также можете сделать это без необходимости Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();

18

Путь Джозе тоже нужен LINQ, ToList()находится в System.Linqпространстве имен.

Вы можете преобразовать Array в List без Linq, передав массив в конструктор List:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

18

Лучше использовать, int.TryParseчтобы избежать исключений;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();

10

Также возможно использовать массив int для прямого присваивания значения.

как это

int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();

4

также вы можете использовать этот метод расширения

public static List<int> SplitToIntList(this string list, char separator = ',')
{
    return list.Split(separator).Select(Int32.Parse).ToList();
}

использование:

var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');

3

На Unity3d int.Parseплохо работает. Поэтому я использую как ниже.

List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
 new Converter<string, int>((s)=>{return Convert.ToInt32(s);}) ) );

Надеюсь, что эта помощь для пользователей Unity3d.


3

Вы можете использовать новые возможности языка C # 6.0:

  • замените делегата (s) => { return Convert.ToInt32(s); }соответствующей группой методовConvert.ToInt32
  • заменить избыточный вызов конструктора: new Converter<string, int>(Convert.ToInt32)на:Convert.ToInt32

Результат будет:

var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));

2

Моя проблема была похожа, но с неудобством, что иногда строка содержит буквы (иногда пустые).

string sNumbers = "1,2,hh,3,4,x,5";

Попытка следовать методу расширения Pcode Xonos:

public static List<int> SplitToIntList(this string list, char separator = ',')
{
      int result = 0;
      return (from s in list.Split(',')
              let isint = int.TryParse(s, out result)
              let val = result
              where isint
              select val).ToList(); 
}

1
Спасибо, хотя вы объявляете разделитель, а затем не используете его.
Хьюго Делсинг

-2

Вы можете использовать это:

List<Int32> sNumberslst = sNumbers.Split(',').ConvertIntoIntList();

2
Добро пожаловать в стек переполнения! Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код. Также постарайтесь не переполнять ваш код пояснительными комментариями, так как это снижает удобочитаемость кода и пояснений!
До свидания StackExchange

2
Функция ConvertIntoIntList не завершается.
Федерико Наваррете

Также вам необходимо добавить следующий класс: статический публичный класс HelperMethods {статический публичный список <int> ConvertIntoIntList (this string [] stringList) {int x = 0; var intList = stringList.Where (str => int.TryParse (str, out x)) .Select (str => x) .ToList (); вернуть intList; }}
Федерико Наваррете
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.