2011-01-24 32 views
14

tôi có một danh sách như thế này:Sắp xếp một danh sách các chuỗi số lượng (1,2, ..., thay vì 9,10 1,10,2)

var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"}; 

Nếu tôi gọi l.Sort (), danh sách được sắp xếp theo thứ tự 1,10,2,3 có ý nghĩa từ quan điểm chuỗi thuần túy, nhưng hút từ góc độ người dùng.

Vì tôi không muốn/không thể buộc người dùng đặt tên cho họ là 01, 02, 03, ... Tôi tự hỏi liệu có phương pháp tích hợp hay thuật toán đơn giản để phát hiện và sắp xếp số đúng cách , để tôi có 1,2,3,10? Vì các số chỉ dài 1 hoặc 2 ký tự (ví dụ, không quá 99), tôi có thể thực hiện một regex tạm thời tiền tố tất cả các số có 1 chữ số với 0 và sắp xếp, nhưng trước khi tôi phát minh lại bánh xe, tôi tự hỏi có gì không tồn tại ?

.net 3.5SP1 nếu có vấn đề, không phải là 4.0

+1

Có vẻ như có liên quan, hãy xem http://stackoverflow.com/questions/1022203/sorting-strings-containing-numbers-in-a-user-friendly-way – VoodooChild

+0

Bản sao của http://stackoverflow.com/ q/248603/24874 –

Trả lời

20

Cách tiếp cận tốt nhất là cách sử dụng IComparer. Điều này đã được thực hiện và có thể là found on code project.

+1

+1 ... hoặc sử dụng giải pháp hiện có –

+0

Tôi đã sử dụng cùng một giải pháp này trong quá khứ - đã hoạt động như một sự quyến rũ! – Pwninstein

+1

Tôi thích các giải pháp hiện có và được thử nghiệm - hoạt động như một sự quyến rũ! Gợi ý cho bất kỳ ai muốn sử dụng điều này: Loại bỏ NumericComparer.cs, di chuyển hàm So sánh sang StringLogicalComparer, tạo So sánh (chuỗi, chuỗi) không tĩnh và có lớp triển khai IComparer, IComparer

0

Bạn có thể triển khai IComparer của riêng mình có thể sử dụng cụm từ thông dụng trên đầu vào ("bla 1.txt"), chuyển đổi thành int và so sánh giá trị được phân tích đó.

10

Tại sao không viết nội dung nào đó sẽ trích xuất một số từ chuỗi, như thế này?

// Note: This could very well be a bad implementation. I'm not too great with Regex. 
static int ExtractNumber(string text) 
{ 
    Match match = Regex.Match(text, @"(\d+)"); 
    if (match == null) 
    { 
     return 0; 
    } 

    int value; 
    if (!int.TryParse(match.Value, out value)) 
    { 
     return 0; 
    } 

    return value; 
} 

Sau đó, bạn có thể sắp xếp danh sách của bạn sử dụng:

list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y))); 

này đập vào mắt tôi là khá hiệu quả, nhưng nó phải là chức năng ít nhất.

Các vấn đề liên quan