Làm cách nào tôi có thể chuyển đổi chuỗi được phân tách bằng dấu phẩy thành Danh sách <int>


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

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

Điều này không hoạt động vì phương thức phân tách trả về một chuỗi []



Câu trả lời:


432

Đây là một cách để làm điều đó:

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

11
Đó cũng có thể làList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog

2
Có cần cho new List<>không?
LiquidPony

2
@L LiquidPony no; ToList()thay vào đó bạn có thể gọi ; kết quả về cơ bản là giống nhau: Tuy nhiên, List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); bạn cần phải làm cái này hoặc cái kia, bởi vì giá trị trả về Select()là một IEnumerable<>, nhưng không phải làList<>
phoog

@L LiquidPony trong triển khai này có vì Selectphần mở rộng trong trường hợp này trả về IEnumerable<Int32>và nó không phải là danh sách. Tuy nhiên, danh sách có một hàm tạo chấp nhận một bộ sưu tập khác làm nguồn.
Oybek

8
Để xử lý trường hợp thẻ là một chuỗi rỗng, hãy sử dụngSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

24

Nếu bạn muốn bao gồm một số xác thực đơn giản và bỏ qua các giá trị không hợp lệ (thay vì đưa ra một ngoại lệ), đây là một cái gì đó sử dụng TryPude:

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: Đây là một truy vấn cập nhật dựa trên phản hồi của Antoine. Trước tiên, nó gọi TryPude để lọc bất kỳ giá trị xấu nào và sau đó Parse để thực hiện chuyển đổi thực tế.

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

Chỉnh sửa 2: Một truy vấn được cập nhật cho C # 7.0, nhờ phản hồi từ Charles Burns. Lưu ý rằng chúng ta loại bỏ biến mos phụ với cách tiếp cận này, vì vậy nó sạch hơn một chút.

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
Thất bại nếu 0 là một đầu vào hợp pháp!
Antoine Meltzheim

2
Với C # 7.0, bạn có thể bỏ qua phần khai báo mos và thay thế cuộc gọi TryPude bằngint.TryParse(m, out int _)
Charles Burns

14

Bạn có thể sử dụng LINQ w / int.Parse()để chuyển đổi string[]thành một IEnumerable<int>và sau đó chuyển kết quả đó cho hàm List<T>tạo:

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

8

Một chút LINQ đi một chặng đường dài:

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

6

Nếu không có truy vấn LINQ, bạn có thể chọn phương thức này,

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

và sau đó bạn có thể chuyển đổi Danh sách này thành loại số nguyên ...


chỉ là một lưu ý cho bất cứ ai không quen = .ToList<string>()vẫn cầnusing System.Linq;
Bill Rawlinson


2

Nếu bạn đang sử dụng C # 3.5, bạn có thể sử dụng Linq để đạt được điều này

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

hoặc ngắn

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();

1

Tôi đã thực hiện một sửa đổi cho câu trả lời của khalid13. Nếu người dùng đặt một chuỗi "0", câu trả lời của anh ta sẽ xóa chuỗi đó khỏi danh sách kết quả. Tôi đã làm một cái gì đó tương tự nhưng sử dụng một đối tượng ẩn danh.

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 là một chức năng tùy chỉnh mà tôi đã thực hiện để bảo vệ nếu chuỗi là null.

Những gì ở trên là loại bỏ bất kỳ chuỗi nào không thể chuyển đổi mà không có lỗi. Nếu bạn cần lỗi nếu có vấn đề với chuyển đổi, thì câu trả lời được chấp nhận sẽ thực hiện thủ thuật.


1

Tôi vấp phải điều này và tôi chỉ muốn chia sẻ giải pháp của riêng mình mà không cần linq. Đây là một cách tiếp cận nguyên thủy. Các giá trị không nguyên sẽ không được thêm vào danh sách.

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);
    }
}

Hi vọng điêu nay co ich.


-2

Thật đơn giản. Đầu tiên tách chuỗi. Cắt chỗ trống hiện tại sau dấu phẩy (,). Sau đó sử dụng hệ thống được định nghĩa ToList ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Để xóa khoảng trắng sau ',' và chuyển đổi văn bản được phân tách bằng dấu phẩy này thành Danh sách

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
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.