Cách sắp xếp danh sách <T> theo một thuộc tính trong đối tượng


1249

Tôi có một lớp được gọi là Ordercó tính chất như OrderId, OrderDate, Quantity, và Total. Tôi có một danh sách của Orderlớp này :

List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders

Bây giờ tôi muốn sắp xếp danh sách dựa trên một thuộc tính của Orderđối tượng, ví dụ tôi cần sắp xếp nó theo ngày đặt hàng hoặc id đơn hàng.

Làm thế nào tôi có thể làm điều này trong C #?


9
Chờ đã - bạn muốn sắp xếp theo cả ngày đặt hàng id đơn hàng? Bởi vì hầu hết các câu trả lời dường như cho rằng bạn chỉ sắp xếp theo cách này hay cách khác.
GalacticCowboy

@GalacticCowboy, @GenericTypeTea: Câu hỏi cho biết "tôi muốn sắp xếp danh sách dựa trên một thuộc tính của đối tượng Đặt hàng", nhưng tôi đồng ý rằng ở nơi khác nó không hoàn toàn rõ ràng. Dù bằng cách nào, nó không tạo ra sự khác biệt lớn cho dù bạn cần sắp xếp theo một hoặc một số thuộc tính.
LukeH

@LukeH - Mới đọc lại và tôi đồng ý. 'Tôi muốn sắp xếp danh sách dựa trên một thuộc tính' ... và 'ngày đặt hàng hoặc id đơn hàng'. Giữa tất cả các câu trả lời, chúng tôi có tất cả các cơ sở được bảo hiểm :).
djdd87

Câu trả lời:


1807

Cách dễ nhất tôi có thể nghĩ là sử dụng Linq:

List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();

22
Làm thế nào tôi có thể sắp xếp này theo thứ tự giảm dần.
Chú gấu dễ thương

229
Danh sách @BonusKun <Đặt hàng> Sắp xếp danh sách = objListOrder. OrderByDesceinating (o => o.OrderDate) .ToList ();
javajavajavajavajava

77
lưu ý rằng điều này tạo ra một danh sách hoàn toàn mới với tất cả các mục trong bộ nhớ, có thể có vấn đề về hiệu suất.
staafl

14
@staafl sẽ listWithObjects = listWithObjects.OrderByDescending(o => o.Status).ToList();đủ cho một nỗ lực như vậy?
Máy mài Andrew

28
@staafl Chúng tôi đang sắp xếp một danh sách các tham chiếu đối tượng, không sao chép chính các đối tượng theo như tôi biết. Mặc dù điều này làm tăng gấp đôi bộ nhớ được sử dụng trong danh sách các tài liệu tham khảo, nhưng nó không tệ bằng việc thực sự sao chép tất cả các đối tượng, vì vậy trong hầu hết các trường hợp bên ngoài những nơi chúng ta đang xử lý các tập dữ liệu khổng lồ và việc giữ chúng trong bộ nhớ đã là một vấn đề, sau đó nó nên đủ
Lazarus

798

Nếu bạn cần sắp xếp danh sách tại chỗ thì bạn có thể sử dụng Sortphương thức, chuyển một Comparison<T>đại biểu:

objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));

Nếu bạn muốn tạo một chuỗi mới, được sắp xếp thay vì sắp xếp tại chỗ thì bạn có thể sử dụng OrderByphương pháp của LINQ , như đã đề cập trong các câu trả lời khác.


30
Có, đây là câu trả lời "chính xác" và sẽ hiệu quả hơn nhiều so với việc tạo một IEnumerable mới và sau đó chuyển đổi nó thành một danh sách mới.
Jonathan Wood

45
Tất nhiên, nếu bạn cần sắp xếp giảm dần, trao đổi xyở phía bên phải của mũi tên =>.
Jeppe Stig Nielsen

15
Câu trả lời thực sự sắp xếp danh sách tại chỗ
Mitchell Currie

3
@PimBrouwers Đây là khoảng thời gian tùy chọn tốt hơn. Ngay cả khi dung lượng bộ nhớ bạn đang sử dụng không phải là vấn đề, giải pháp này vẫn tránh việc cấp phát bộ nhớ không cần thiết, rất tốn kém. Tùy chọn này chỉ đơn giản là mã hóa đơn giản và một thứ tự cường độ nhanh hơn.
Cdaragorn

12
@JonSchneider Vì Nullable<>(lấy DateTime?ví dụ) bạn có thể sử dụng .Sort((x, y) => Nullable.Compare(x.OrderDate, y.OrderDate))sẽ xử lý null như trước tất cả các giá trị không null. Nó chính xác giống như .Sort((x, y) => Comparer<DateTime?>.Default.Compare(x.OrderDate, y.OrderDate).
Jeppe Stig Nielsen

219

Để thực hiện việc này mà không cần LINQ trên .Net2.0:

List<Order> objListOrder = GetOrderList();
objListOrder.Sort(
    delegate(Order p1, Order p2)
    {
        return p1.OrderDate.CompareTo(p2.OrderDate);
    }
);

Nếu bạn đang sử dụng .Net3.0, thì câu trả lời của LukeH là những gì bạn đang theo đuổi.

Để sắp xếp trên nhiều thuộc tính, bạn vẫn có thể thực hiện trong một đại biểu. Ví dụ:

orderList.Sort(
    delegate(Order p1, Order p2)
    {
        int compareDate = p1.Date.CompareTo(p2.Date);
        if (compareDate == 0)
        {
            return p2.OrderID.CompareTo(p1.OrderID);
        }
        return compareDate;
    }
);

Điều này sẽ cung cấp cho bạn ngày tăng dần với thứ tự giảm dần .

Tuy nhiên, tôi không khuyên bạn nên gắn bó với các đại biểu vì điều đó có nghĩa là nhiều nơi không sử dụng lại mã. Bạn nên thực hiện IComparervà chỉ cần chuyển nó qua Sortphương thức của bạn . Xem ở đây .

public class MyOrderingClass : IComparer<Order>
{
    public int Compare(Order x, Order y)
    {
        int compareDate = x.Date.CompareTo(y.Date);
        if (compareDate == 0)
        {
            return x.OrderID.CompareTo(y.OrderID);
        }
        return compareDate;
    }
}

Và sau đó để sử dụng lớp IComparer này, chỉ cần khởi tạo nó và chuyển nó đến phương thức Sắp xếp của bạn:

IComparer<Order> comparer = new MyOrderingClass();
orderList.Sort(comparer);

1
Câu trả lời tuyệt vời, và phải là câu trả lời đúng vì nó bảo vệ việc khởi tạo lại danh sách ban đầu (phiên bản LINQ sẽ luôn luôn làm) cung cấp đóng gói tốt hơn.
Jeb

@wonton, không. Ý tưởng là để có thể có các IComparertriển khai khác nhau , cho chúng ta hành vi đa hình.
radarbob

Đã làm cho tôi. Tôi đã đăng một phiên bản này với các tùy chọn sắp xếp.
Jack Griffin

109

Cách đơn giản nhất để đặt hàng một danh sách là sử dụng OrderBy

 List<Order> objListOrder = 
    source.OrderBy(order => order.OrderDate).ToList();

Nếu bạn muốn đặt hàng theo nhiều cột như truy vấn SQL.

ORDER BY OrderDate, OrderId

Để đạt được điều này bạn có thể sử dụng ThenBynhư sau.

  List<Order> objListOrder = 
    source.OrderBy(order => order.OrderDate).ThenBy(order => order.OrderId).ToList();

32

Làm điều đó mà không có Linq như bạn nói:

public class Order : IComparable
{
    public DateTime OrderDate { get; set; }
    public int OrderId { get; set; }

    public int CompareTo(object obj)
    {
        Order orderToCompare = obj as Order;
        if (orderToCompare.OrderDate < OrderDate || orderToCompare.OrderId < OrderId)
        {
            return 1;
        }
        if (orderToCompare.OrderDate > OrderDate || orderToCompare.OrderId > OrderId)
        {
            return -1;
        }

        // The orders are equivalent.
        return 0;
    }
}

Sau đó, chỉ cần gọi .sort () trong danh sách Đơn hàng của bạn


3
Đầu tiên phải kiểm tra nulltrên asdiễn viên. Đó là toàn bộ quan điểm as, như (ha, ha) (Order)objném một ngoại lệ khi nó thất bại. if(orderToCompare == null) return 1;.
radarbob

+1 để sử dụng giao diện, giúp mã dễ bảo trì hơn và thể hiện rõ khả năng của đối tượng.
AeonOfTime

Nếu Bill và Ted xuất hiện, tôi sẽ yêu cầu họ đưa tôi trở lại vào ngày 16 tháng 10 năm 2014 để tôi có thể sửa lỗi của mình ở trên - astrả lại nullnếu diễn viên thất bại. Nhưng ít nhất kiểm tra null là đúng.
radarbob

@radarbob vâng .. ôi. :) Nhưng! Chức năng này được dự định sẽ được sử dụng tự động bởi một loại trong danh sách, List<Order>vì vậy loại này sẽ được đảm bảo khớp với asnăm 2014 nên bạn có thể không viết một lỗi, nhiều như tránh một tuyên bố bảo vệ không cần thiết :)
Jimmy Hoffa

cần được đảm bảo Điểm thú vị. Nếu nó được gói gọn sao cho nó không thể được gọi ngoại trừ để vượt qua a List<Order>; nhưng cả bạn và tôi đều đã gặp lập trình viên tự đóng gói, người cho rằng không nói rõ là "tôi đang viết mã này để nó không bị sử dụng sai"
radarbob

26

Một giải pháp hướng đối tượng cổ điển

Trước tiên, tôi phải tìm hiểu về sự tuyệt vời của LINQ .... Bây giờ chúng ta đã giải quyết được điều đó

Một biến thể về câu trả lời của JimmyHoffa. Với generic, CompareTotham số trở thành loại an toàn.

public class Order : IComparable<Order> {

    public int CompareTo( Order that ) {
        if ( that == null ) return 1;
        if ( this.OrderDate > that.OrderDate) return 1;
        if ( this.OrderDate < that.OrderDate) return -1;
        return 0;
    }
}

// in the client code
// assume myOrders is a populated List<Order>
myOrders.Sort(); 

Tất nhiên, khả năng sắp xếp này có thể sử dụng lại. Đó là mỗi khách hàng không phải viết lại logic sắp xếp. Hoán đổi "1" và "-1" (hoặc các toán tử logic, lựa chọn của bạn) đảo ngược thứ tự sắp xếp.


Cách tiếp cận đơn giản để sắp xếp các đối tượng trong Danh sách. Nhưng tôi không hiểu tại sao bạn trả về 1 nếu (that == null)?
Lộc Huỳnh

4
nó có nghĩa là thisđối tượng lớn hơn null. Đối với mục đích sắp xếp, một đối tượng null tham chiếu "nhỏ hơn" thisđối tượng. Đó chỉ là cách tôi quyết định xác định cách null sẽ sắp xếp.
radarbob

18

// Sắp xếp hoàn toàn chung để sử dụng với Gridview

public List<T> Sort_List<T>(string sortDirection, string sortExpression, List<T> data)
    {

        List<T> data_sorted = new List<T>();

        if (sortDirection == "Ascending")
        {
            data_sorted = (from n in data
                              orderby GetDynamicSortProperty(n, sortExpression) ascending
                              select n).ToList();
        }
        else if (sortDirection == "Descending")
        {
            data_sorted = (from n in data
                              orderby GetDynamicSortProperty(n, sortExpression) descending
                              select n).ToList();

        }

        return data_sorted;

    }

    public object GetDynamicSortProperty(object item, string propName)
    {
        //Use reflection to get order type
        return item.GetType().GetProperty(propName).GetValue(item, null);
    }

4
Hoặc, bạn biết , data.OrderBy(). Bit dễ dàng hơn mà phát minh lại bánh xe.
gunr2171

4
Ý tưởng là điều này sẽ làm việc với bất kỳ loại đối tượng. Trong đó OrderBy () chỉ hoạt động với các đối tượng được gõ mạnh.
roger

1
Thx rất nhiều. Theo ý kiến ​​của tôi, giải pháp sắp xếp dữ liệu lưới đơn giản và có thể sử dụng nhất!
kostas ch.

6

Đây là một phương pháp mở rộng LINQ chung không tạo thêm một bản sao của danh sách:

public static void Sort<T,U>(this List<T> list, Func<T, U> expression)
    where U : IComparable<U>
{
    list.Sort((x, y) => expression.Invoke(x).CompareTo(expression.Invoke(y)));
}

Để dùng nó:

myList.Sort(x=> x.myProperty);

Gần đây tôi đã xây dựng một bổ sung này chấp nhận một ICompare<U>, để bạn có thể tùy chỉnh so sánh. Điều này rất hữu ích khi tôi cần thực hiện sắp xếp chuỗi tự nhiên:

public static void Sort<T, U>(this List<T> list, Func<T, U> expression, IComparer<U> comparer)
    where U : IComparable<U>
{    
    list.Sort((x, y) => comparer.Compare(expression.Invoke(x), expression.Invoke(y)));
}

Tôi đã thực hiện điều này, hoạt động tốt. Tôi đã thêm một tham số "isAsceinating = true". Để sắp xếp theo thứ tự giảm dần, chỉ cần trao đổi x và y xung quanh trong hai phương thức Invoke (). Cảm ơn.
Rob L

Nếu bạn sắp biên dịch biểu thức, bạn cũng có thể chấp nhận một đại biểu để bắt đầu. Ngoài ra, phương pháp này có vấn đề lớn nếu bộ chọn gây ra tác dụng phụ, tốn kém để tính toán hoặc không mang tính quyết định. Một cách sắp xếp phù hợp dựa trên biểu thức đã chọn cần gọi bộ chọn không quá một lần cho mỗi mục trong danh sách.
Phục vụ

@Servy - đó đều là những điểm hợp lệ, nhưng tôi thành thật mà nói, tôi không chắc cách triển khai một số đề xuất của bạn (đặc biệt là ngăn chặn bộ chọn gây ra tác dụng phụ ...?). Tôi đã thay đổi họ thành đại biểu. Nếu bạn biết cách thực hiện một số thay đổi đó, tôi sẽ rất vui khi bạn chỉnh sửa mã của tôi.
Peter

3
@Peter Bạn không thể ngăn các đại biểu gây ra tác dụng phụ. Những gì bạn có thể làm là đảm bảo họ không bao giờ được gọi nhiều hơn một lần cho mỗi đối tượng, điều này có nghĩa là tính toán các giá trị cho từng đối tượng, lưu trữ các cặp đối tượng / dự kiến-giá trị và sau đó sắp xếp . OrderBylàm tất cả những điều đó trong nội bộ.
Phục vụ

Một cách hay khác để viết một voidphương thức mở rộng theo tinh thần này: static class Extensions { public static void SortBy<TSource, TKey>(this List<TSource> self, Func<TSource, TKey> keySelector) { self.SortBy(keySelector, Comparer<TKey>.Default); } public static void SortBy<TSource, TKey>(this List<TSource> self, Func<TSource, TKey> keySelector, IComparer<TKey> comparer) { self.Sort((x, y) => comparer.Compare(keySelector(x), keySelector(y))); } }Có thể được bổ sung bằng một SortByDescendingphương pháp. @ Nhận xét của Servy cũng áp dụng cho mã của tôi!
Jeppe Stig Nielsen

4

Sử dụng LINQ

objListOrder = GetOrderList()
                   .OrderBy(o => o.OrderDate)
                   .ToList();

objListOrder = GetOrderList()
                   .OrderBy(o => o.OrderId)
                   .ToList();

3
//Get data from database, then sort list by staff name:

List<StaffMember> staffList = staffHandler.GetStaffMembers();

var sortedList = from staffmember in staffList
                 orderby staffmember.Name ascending
                 select staffmember;

3

Một phiên bản cải tiến của Rogers.

Vấn đề với GetDAVESortProperty là chỉ lấy tên thuộc tính nhưng điều gì xảy ra nếu trong GridView chúng tôi sử dụng NavigationProperives? nó sẽ gửi một ngoại lệ, vì nó tìm thấy null.

Thí dụ:

"Employee.Company.Name;" sẽ sụp đổ ... vì chỉ cho phép "Tên" làm tham số để nhận giá trị của nó.

Đây là phiên bản cải tiến cho phép chúng tôi sắp xếp theo Thuộc tính Điều hướng.

public object GetDynamicSortProperty(object item, string propName)
    {
        try
        {                 
            string[] prop = propName.Split('.'); 

            //Use reflection to get order type                   
            int i = 0;                    
            while (i < prop.Count())
            {
                item = item.GetType().GetProperty(prop[i]).GetValue(item, null);
                i++;
            }                     

            return item;
        }
        catch (Exception ex)
        {
            throw ex;
        }


    } 

3

Bạn có thể làm một cái gì đó chung chung hơn về lựa chọn thuộc tính nhưng cụ thể về loại bạn đang chọn, trong trường hợp của bạn 'Đặt hàng':

viết hàm của bạn như là một hàm chung:

public List<Order> GetOrderList<T>(IEnumerable<Order> orders, Func<Order, T> propertySelector)
        {
            return (from order in orders
                    orderby propertySelector(order)
                    select order).ToList();
        } 

và sau đó sử dụng nó như thế này:

var ordersOrderedByDate = GetOrderList(orders, x => x.OrderDate);

Bạn thậm chí có thể chung chung hơn và xác định loại mở cho những gì bạn muốn đặt hàng:

public List<T> OrderBy<T,P>(IEnumerable<T> collection, Func<T,P> propertySelector)
        {
            return (from item in collection
                    orderby propertySelector(item)
                    select item).ToList();
        } 

và sử dụng nó theo cùng một cách:

var ordersOrderedByDate = OrderBy(orders, x => x.OrderDate);

Đó là một cách phức tạp không cần thiết ngu ngốc khi thực hiện kiểu 'OrderBy' theo kiểu LINQ, nhưng nó có thể cho bạn manh mối về cách thực hiện theo cách chung chung


3

Vui lòng để tôi hoàn thành câu trả lời của @LukeH với một số mã mẫu, vì tôi đã kiểm tra nó tôi tin rằng nó có thể hữu ích cho một số:

public class Order
{
    public string OrderId { get; set; }
    public DateTime OrderDate { get; set; }
    public int Quantity { get; set; }
    public int Total { get; set; }

    public Order(string orderId, DateTime orderDate, int quantity, int total)
    {
        OrderId = orderId;
        OrderDate = orderDate;
        Quantity = quantity;
        Total = total;
    }
}

public void SampleDataAndTest()
{
    List<Order> objListOrder = new List<Order>();

    objListOrder.Add(new Order("tu me paulo ", Convert.ToDateTime("01/06/2016"), 1, 44));
    objListOrder.Add(new Order("ante laudabas", Convert.ToDateTime("02/05/2016"), 2, 55));
    objListOrder.Add(new Order("ad ordinem ", Convert.ToDateTime("03/04/2016"), 5, 66));
    objListOrder.Add(new Order("collocationem ", Convert.ToDateTime("04/03/2016"), 9, 77));
    objListOrder.Add(new Order("que rerum ac ", Convert.ToDateTime("05/02/2016"), 10, 65));
    objListOrder.Add(new Order("locorum ; cuius", Convert.ToDateTime("06/01/2016"), 1, 343));


    Console.WriteLine("Sort the list by date ascending:");
    objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));

    foreach (Order o in objListOrder)
        Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);

    Console.WriteLine("Sort the list by date descending:");
    objListOrder.Sort((x, y) => y.OrderDate.CompareTo(x.OrderDate));
    foreach (Order o in objListOrder)
        Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);

    Console.WriteLine("Sort the list by OrderId ascending:");
    objListOrder.Sort((x, y) => x.OrderId.CompareTo(y.OrderId));
    foreach (Order o in objListOrder)
        Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);

    //etc ...
}

3
var obj = db.Items.Where...

var orderBYItemId = obj.OrderByDescending(c => Convert.ToInt32(c.ID));


1

Dựa trên Trình so sánh của GenericTypeTea :
chúng tôi có thể linh hoạt hơn bằng cách thêm các cờ sắp xếp:

public class MyOrderingClass : IComparer<Order> {  
    public int Compare(Order x, Order y) {  
        int compareDate = x.Date.CompareTo(y.Date);  
        if (compareDate == 0) {  
            int compareOrderId = x.OrderID.CompareTo(y.OrderID);  

            if (OrderIdDescending) {  
                compareOrderId = -compareOrderId;  
            }  
            return compareOrderId;  
        }  

        if (DateDescending) {  
            compareDate = -compareDate;  
        }  
        return compareDate;  
    }  

    public bool DateDescending { get; set; }  
    public bool OrderIdDescending { get; set; }  
}  

Trong trường hợp này, bạn phải khởi tạo nó một cách rõ ràng dưới dạng MyOrderingClass (chứ không phải IComparer )
để đặt các thuộc tính sắp xếp của nó:

MyOrderingClass comparer = new MyOrderingClass();  
comparer.DateDescending = ...;  
comparer.OrderIdDescending = ...;  
orderList.Sort(comparer);  

1

Không có câu trả lời nào ở trên đủ chung cho tôi nên tôi đã trả lời câu này:

var someUserInputStringValue = "propertyNameOfObject i.e. 'Quantity' or 'Date'";
var SortedData = DataToBeSorted
                   .OrderBy(m => m.GetType()
                                  .GetProperties()
                                  .First(n => 
                                      n.Name == someUserInputStringValue)
                   .GetValue(m, null))
                 .ToList();

Cẩn thận trên bộ dữ liệu lớn mặc dù. Đó là mã dễ dàng nhưng có thể khiến bạn gặp rắc rối nếu bộ sưu tập rất lớn và loại đối tượng của bộ sưu tập có số lượng lớn các trường. Thời gian chạy là NxM trong đó:

N = # của các yếu tố trong bộ sưu tập

M = # thuộc tính trong đối tượng


1

Bất kỳ ai làm việc với các loại nullable, Valueđược yêu cầu sử dụng CompareTo.

objListOrder.Sort((x, y) => x.YourNullableType.Value.CompareTo(y.YourNullableType.Value));


0

Từ quan điểm hiệu suất, tốt nhất là sử dụng một danh sách được sắp xếp để dữ liệu được sắp xếp khi nó được thêm vào kết quả. Các cách tiếp cận khác cần ít nhất một lần lặp thêm trên dữ liệu và hầu hết tạo ra một bản sao dữ liệu để không chỉ hiệu suất mà cả việc sử dụng bộ nhớ cũng bị ảnh hưởng. Có thể không phải là vấn đề với vài trăm yếu tố nhưng sẽ là hàng ngàn, đặc biệt là trong các dịch vụ nơi nhiều yêu cầu đồng thời có thể thực hiện sắp xếp cùng một lúc. Hãy xem không gian tên System.Collections.Generic và chọn một lớp có sắp xếp thay vì List.

Và tránh thực hiện chung bằng cách sử dụng sự phản chiếu khi có thể, điều này cũng có thể gây ra vấn đề hiệu suất.


Làm thế nào điều này có thể được thực hiện nhiều hơn? Chèn dữ liệu vào danh sách được sắp xếp là O (n), vì vậy việc thêm n mục là O (n ^ 2). Những gì nó nhiều mục đồng thời đang cố gắng để được thêm vào? Có những tình huống khi bạn có thêm chu kỳ CPU để ghi trong khi các mục đang được thêm, nhưng đây không phải là một giải pháp chung tốt.
John La Rooy

0

Giả sử bạn có mã sau đây, trong mã này, chúng tôi có một lớp Hành khách với một vài thuộc tính mà chúng tôi muốn sắp xếp dựa trên.

public class Passenger
{
    public string Name { get; }
    public string LastName { get; }
    public string PassportNo { get; }
    public string Nationality { get; }

    public Passenger(string name, string lastName, string passportNo, string nationality)
    {
        this.Name = name;
        this.LastName = lastName;
        this.PassportNo = passportNo;
        this.Nationality = nationality;
    }

    public static int CompareByName(Passenger passenger1, Passenger passenger2)
    {
        return String.Compare(passenger1.Name, passenger2.Name);
    }

    public static int CompareByLastName(Passenger passenger1, Passenger passenger2)
    {
        return String.Compare(passenger1.LastName, passenger2.LastName);
    }

    public static int CompareNationality(Passenger passenger1, Passenger passenger2)
    {
        return String.Compare(passenger1.Nationality, passenger2.Nationality);
    }
}

public class TestPassengerSort
{
    Passenger p1 = new Passenger("Johon", "Floid", "A123456789", "USA");
    Passenger p2 = new Passenger("Jo", "Sina", "A987463215", "UAE");
    Passenger p3 = new Passenger("Ped", "Zoola", "A987855215", "Italy");

    public void SortThem()
    {
        Passenger[] passengers = new Passenger[] { p1, p2, p3 };
        List<Passenger> passengerList = new List<Passenger> { p1, p2, p3 };

        Array.Sort(passengers, Passenger.CompareByName);
        Array.Sort(passengers, Passenger.CompareByLastName);
        Array.Sort(passengers, Passenger.CompareNationality);

        passengerList.Sort(Passenger.CompareByName);
        passengerList.Sort(Passenger.CompareByLastName);
        passengerList.Sort(Passenger.CompareNationality);

    }
}

Vì vậy, bạn có thể thực hiện cấu trúc sắp xếp của mình bằng cách sử dụng ủy nhiệm Thành phần.

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.