按类的元素对列表进行排序

时间:2014-07-29 06:32:21

标签: c# list sorting

首先祝贺网络,这是我的第一个问题,但我在此之前已经找到了很多答案。 这是我的问题:我必须从excel文件中获取一些数据并将其打印在文件中。直到这里一切都好。但是,根据文件列表的顺序,我会以一个或另一个顺序获取数据。我的建议是在从excel获取所有数据之后,按照账单日期(数据的一个元素)对这些数据进行排序。我在下面描述我的课程。

我有我的比尔课程:

class Bill
{
    private string billNumber;
    private string billDate;
    private DateTime date;
    private string from;
    private string to;
    private string billCost;
    private string power1;
    private string power2;
    private string power3;
    private string power4;
    private string power5;
    private string power6;
    private string contractNumber;
}

这是我的合同类:

class Contract
{
    private List<Bill> billList;
    private Dictionary<double, Bill> billsDictionary;
    private double contractNumber;
}

在我的课程结束后,我有一个List<Contract>。 我希望按日期对合同类的List<Bill>进行排序,以便能够以正确的顺序打印帐单,但我找不到任何解决方案来订购它们。

提前致谢。

问候。

2 个答案:

答案 0 :(得分:0)

你应该可以使用像q = q.OrderBy(a => a.ColumnName)这样的linq来做到这一点,但是你可能想要检查你的属性的访问修饰符,你可以从外面访问它们是私有的。

以下是与Linq订购的简单示例:

        class Pet
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }

        public static void OrderByEx1()
        {
            Pet[] pets = { new Pet { Name="Barley", Age=8 },
                           new Pet { Name="Boots", Age=4 },
                           new Pet { Name="Whiskers", Age=1 } };

            IEnumerable<Pet> query = pets.OrderBy(pet => pet.Age);

            foreach (Pet pet in query)
            {
                Console.WriteLine("{0} - {1}", pet.Name, pet.Age);
            }
        }

        /*
         This code produces the following output:

         Whiskers - 1
         Boots - 4
         Barley - 8
        */

请注意该类的属性是如何公开的,以便您可以从代码中的任何位置访问它们。

有关排序的更多信息,请here

答案 1 :(得分:0)

有两种解决方案。首先,您需要公开可用于排序的属性。

public class Bill
{
    // ... rest of your code 

    public DateTime Date  
    {   
        get 
        {
            return this.date;
        }
    }
}

1)您可以将列表的Sort与传递的比较器(msdn)一起使用:

public class Comp : IComparer<Bill>
{
    public int Compare(Bill x, Bill y)
    {
       // remember to handle null values first (x or y or both are nulls)
       return x.Date.CompareTo(y.Date);
    }
}

然后:

billList.Sort(new Comp());

请注意:如果您将Comp 声明为Bill 的嵌套类,则您不必添加属性Date。您将能够看到Bill的私有字段并将其用于比较..

2)您可以使用linq(它创建List的新实例):

billList = billList.OrderBy(bill => bill.Date).ToList();