Làm cách nào để sắp xếp danh sách chung DESC và ASC?


110

Làm cách nào để sắp xếp danh sách chung DESC và ASC? Có LINQ và không có LINQ? Tôi đang sử dụng VS2008.

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}

Câu trả lời:


246

Với Linq

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

Không có Linq

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

Lưu ý rằng không có Linq, bản thân danh sách đang được sắp xếp. Với Linq, bạn nhận được danh sách có thứ tự nhưng bản thân danh sách không thay đổi. Nếu bạn muốn thay đổi danh sách, bạn sẽ thay đổi các phương thức Linq thành một cái gì đó như

li = li.OrderBy(i => i).ToList();

1
@onedaywhen Nếu bạn cảm thấy câu trả lời của người dùng khác không chính xác, bạn nên bình luận, bỏ phiếu và / hoặc đưa ra câu trả lời mà bạn cảm thấy là đúng, không chỉnh sửa câu trả lời của người khác để trở thành câu bạn nghĩ là đúng.
Servy

24
Tôi nghĩ rằng đối với thứ tự giảm dần thì cách sử dụng rõ ràng hơn nhiều li.Sort((a, b) => b.CompareTo(a));so với -1*cách tiếp cận được sử dụng ở đây. Tôi đã chỉnh sửa câu trả lời cho phù hợp nhưng @Servy đã hoàn nguyên nó.
ngày

9
@onedaywhen Khi tác giả viết sai những gì họ dự định, thay đổi nó thành những gì họ dự định viết là tốt. Thay đổi mẫu mã mà người khác nghĩ rằng giải pháp nên sử dụng một cách tiếp cận khác mà bạn cảm thấy nên được sử dụng thay thế không phải là một chỉnh sửa thích hợp.
Servy

5
@onedaywhen Sure; bạn sẽ thấy nó ở bất cứ đâu bạn thấy phần chỉnh sửa được mô tả. Từ trung tâm trợ giúp, "Khi nào tôi nên chỉnh sửa bài đăng? [...] Để làm rõ ý nghĩa của bài đăng (mà không làm thay đổi ý nghĩa đó)"
Servy

4
Hoặc chỉ -a.CompareTo(b).
Shimmy Weitzhandler, 27/07/17

72

Không có Linq:

Tăng dần:

li.Sort();

Giảm dần:

li.Sort();
li.Reverse();

Sort()là một phương thức void, vì vậy bạn không thể chuỗi Reverse()vào nó theo cách này. Bạn sẽ cần 2 thao tác riêng biệt. Tuy nhiên, với LINQ, bạn có thể chuỗi nó thành một OrderBynhưng tại thời điểm đó, bạn chỉ nên sử dụng OrderByDescendingthay thế.
Ahmad Mageed


3

Tôi đã kiểm tra tất cả các câu trả lời ở trên và muốn thêm một thông tin bổ sung. Tôi muốn sắp xếp danh sách theo thứ tự DESC và tôi đang tìm kiếm giải pháp nhanh hơn cho các đầu vào lớn hơn và tôi đã sử dụng phương pháp này trước đó: -

li.Sort();
li.Reverse();

nhưng các trường hợp thử nghiệm của tôi đã không thành công vì vượt quá giới hạn thời gian, vì vậy giải pháp dưới đây phù hợp với tôi: -

li.Sort((a, b) => b.CompareTo(a));

Vì vậy, cuối cùng kết luận là cách thứ 2 của danh sách Sắp xếp theo thứ tự giảm dần nhanh hơn một chút so với cách trước.


-3

Cách rất đơn giản để sắp xếp Danh sách với các giá trị int theo thứ tự Giảm dần:

li.Sort((a,b)=> b-a);

Hy vọng rằng điều này sẽ giúp!


4
Đây không phải int.CompareTo(int)là lý do. Xem nguồn tại Referenceource.microsoft.com có ghi: " Cần sử dụng so sánh vì phép trừ sẽ chuyển thành dương đối với số âm rất lớn, v.v. ". Nếu bạn có b = int.MinValuea = 1(nói), điều này sẽ không thành công. Đôi khi một cuộc gọi phương thức là đáng giá.
Wai Ha Lee

Câu hỏi nói về sắp xếp danh sách chung. Thao tác "-" thậm chí không thể biên dịch cho nhiều kiểu. Và đối với bộ biên soạn các loại bạn có thể có lỗi tràn số như đã đề cập trong comment trước
Vadim Levkovsky
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.