2010-06-14 70 views
6

Đây là một trường hợp kỳ lạ mà tôi phải thừa nhận, nhưng tôi đang cố gắng tìm một cách gọn gàng và thanh lịch để chuyển đổi List<int> thành int thực tế. Ví dụ, nếu danh sách của tôi chứa các mục 1, 2 và 3, thì số nguyên cuối cùng sẽ là 123. Cách duy nhất khác mà tôi nghĩ là thực hiện chuyển đổi mảng thành chuỗi và sau đó phân tích cú pháp chuỗi.Chuyển đổi Danh sách Int thành Số nguyên

Bất kỳ gợi ý nào?

+0

Ghi chú rằng các nội dung của danh sách của bạn phải xuất trình một int hợp lệ (có nghĩa là, một số nguyên trong phạm vi -2,147,483,648 thông qua +24747,483,647). – Humberto

+1

Ngoài ra, điều gì sẽ xảy ra nếu danh sách của bạn giống như danh sách {100, 1, 0, 2}? – Humberto

+0

Quy tắc nếu danh sách của bạn chứa giá trị> = 10 là gì? ví dụ. 1, 20, 33, 4 có trở thành 120334 không? Nếu có, câu trả lời "bội số 10" bên dưới sẽ không thành công. –

Trả lời

14

Lặp lại danh sách, như thể thêm tổng, nhưng nhân tổng số đang chạy với 10 ở mỗi giai đoạn.

int total = 0; 
foreach (int entry in list) 
{ 
    total = 10 * total + entry; 
} 
+3

Điều gì sẽ xảy ra nếu các mục nhập không phải là các chữ số đơn? Cho phép nói: {1,3,15} Kết quả mong đợi: 1,315 Kết quả thực tế: 145 – RonK

+0

@RonK. Đúng, nó mang thêm chữ số. Vấn đề đã được trình bày với các chữ số duy nhất, mà nó hoạt động, nhưng rõ ràng hơn là cần thiết ở đây trên kết quả mong muốn tôi đồng ý. –

+0

Cũng phát hiện RonK, trong bất kỳ trường hợp nào khác, điều này sẽ đúng.Đối với tôi nó không phải là tôi đang lặp qua một mảng ký tự vì vậy tôi nghĩ rằng điều này sẽ làm việc. Sẽ kiểm tra sau bữa trưa. – Kezzer

1

Tôi nghĩ rằng bạn đề nghị là khá tốt, cái gì như thế này hoạt động:

var list = new List<int>() { 1, 2, 3, 4 }; 
var listAsString = String.Join("", list.ConvertAll(x => x.ToString()).ToArray()); 
Console.WriteLine(listAsString); 
int result = Int32.Parse(listAsString); 
Console.WriteLine(result); 
+0

dangit đánh tôi với cú đấm. – Will

2
List<int> l = new List<int>(); 
// add numbers 
int result = int.Parse(string.Join(",", l).Replace(",", "")) 

Bạn sẽ phải chăm sóc nếu danh sách là thời gian đủ dài để các số kết quả sẽ vượt quá các giới hạn cho một int mặc dù.

+1

Bạn không thể làm 'int.Parse (string.Join (" ", l))'? – Kezzer

0

Bạn có thể làm điều đó bằng cách thêm tất cả các số trong một vòng lặp. Bạn không chắc chắn nó nhanh hơn phân tích cú pháp chuỗi mặc dù:

List<int> list = new List<int> {1, 2, 3}; 
int sum = 0; 
int pow = list.Count - 1; 
for (int i = 0; i <= pow; i++) 
{ 
    sum += list[i] * (int)Math.Pow(10,(pow-i)); 
} 

Ngoài ra nếu bạn có danh sách dài, bạn có thể muốn sử dụng lớp BigInteger của Net 4 thay vì int.

0

Vâng chỉ để cho vui (tôi không có ý tưởng như thế nào effecient đây là, có lẽ không phải là rất), bạn cũng có thể làm điều này một cách dễ dàng với LINQ ...

đầu tiên chuyển đổi danh sách các ints vào một danh sách các chuỗi, sau đó sử dụng hàm tổng hợp để nối chúng, sau đó ở cuối sử dụng in32.TryParse để đảm bảo giá trị kết quả nằm trong phạm vi int.

string val = ints.Select(i=> i.ToString()).Aggregate((s1, s2) => s1 + s2); 
0

Này, bạn có một đếm được như

var digits = [1, 2, 3 ...]; 

sau đó bạn có thể làm:

// simplest and correct way; essentially the accepted answer but using LINQ 
var number = digits.Aggregate((a, b) => a * 10 + b); 

// string manipulation; works for sets like [10, 20, 30] 
var number = int.Parse(string.Join("", digits)); 

// using `Select` instead of `Aggregate` but verbose; not very useful 
var number = (int)digits.Select((d, i) => d * Math.Pow(10, digits.Count() - i - 1)).Sum(); 
Các vấn đề liên quan