Chia chuỗi, chuyển đổi ToList <int> () trong một dòng


191

Tôi có một chuỗi có số

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

Tôi có thể tách nó sau đó chuyển đổi nó thành List<int>

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

Làm thế nào tôi có thể chuyển đổi mảng chuỗi thành danh sách số nguyên? Vì vậy, tôi sẽ có thể chuyển đổi string[]sangIEnumerable


Chúng tôi đã có chính xác cùng một câu hỏi ngày hôm nay: Click me
Dario

3
trong "một dòng" si rất mạnh là một yêu cầu rất nghiêm ngặt! </ perl>
dfa

2
Câu hỏi này đặc biệt nói để phân chia một chuỗi các số, giữ cho câu trả lời đơn giản. Câu hỏi mà Dario đã đề cập đến các vấn đề xử lý (sa lầy trong?) Của TryPude cho các chuỗi chung.
chào

Câu trả lời:


463
var numbers = sNumbers.Split(',').Select(Int32.Parse).ToList();

4
Điều này có được Ngoại lệ khi Danh sách có giá trị trống hoặc null.
Muhammad nói

@ SayedM.Idrees chỉ kiểm tra null hoặc trống trước khi chia.
RAVI VAGHELA

31

Bạn cũng có thể làm theo cách này mà không cần 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

Cách của Joze cũng cần LINQ, ToList()là trong System.Linqkhông gian tên.

Bạn có thể chuyển đổi Array thành List mà không cần Linq bằng cách chuyển mảng sang hàm tạo List:

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

17

Sử dụng tốt hơn int.TryParseđể tránh ngoại lệ;

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

10

Cũng có thể int mảng để gán giá trị trực tiếp.

như thế này

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

4

bạn cũng có thể sử dụng phương thức mở rộng này

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

sử dụng:

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

3

Trên Unity3d, int.Parsekhông hoạt động tốt. Vì vậy, tôi sử dụng như dưới đây.

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

Hy vọng điều này sẽ giúp cho người dùng Unity3d.


3

Bạn có thể sử dụng các tính năng ngôn ngữ C # 6.0 mới:

  • thay thế đại biểu (s) => { return Convert.ToInt32(s); }bằng nhóm phương thức tương ứngConvert.ToInt32
  • thay thế lệnh gọi constructor dự phòng: new Converter<string, int>(Convert.ToInt32)bằng:Convert.ToInt32

Kết quả sẽ là:

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

2

Vấn đề của tôi là tương tự nhưng với sự bất tiện là đôi khi chuỗi chứa các chữ cái (đôi khi trống).

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

Đang cố gắng làm theo Phương pháp mở rộng 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
Cảm ơn, mặc dù bạn khai báo một dấu phân cách và sau đó bạn không sử dụng nó.
Hugo Delsing

-2

Bạn có thể sử dụng điều này:

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

2
Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Xin vui lòng cố gắng không làm đông mã của bạn với các bình luận giải thích, vì điều này làm giảm khả năng đọc của cả mã và các giải thích!
Tạm biệt StackExchange

2
Hàm ConvertIntoIntList không thoát.
Federico Navarittle

Ngoài ra, bạn cần thêm lớp sau: lớp công khai tĩnh HelperMethods {Danh sách công khai tĩnh <int> ConvertIntoIntList (chuỗi này [] stringList) {int x = 0; var intList = stringList.Where (str => int.TryPude (str, out x)) .Select (str => x) .ToList (); trả về intList; }}
Federico Navarittle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.