使用Linq对Person对象列表进行排序

3

我需要一种查询方法,可以根据对象属性的类别对对象列表进行排序。我希望分组的顺序与通常的字母顺序不同,因为在许多其他示例中都是这样的。我使用了从其他地方获取的示例。如何生成基于HomeProvince的Person对象列表,但按照以下顺序排序:

安大略省、魁北克省、艾伯塔省、曼尼托巴省、不列颠哥伦比亚省。每个组内部的顺序无关紧要。

Person[] people = new Person[]
{
    new Person() { FirstName = "Tony", LastName = "Montana", Age = 39, HomeProvince = "Ontario" },
    new Person() { FirstName = "Bill", LastName = "Smith", Age = 23, HomeProvince = "Ontario" },
    new Person() { FirstName = "Jane", LastName = "Doe", Age = 23, HomeProvince = "Alberta" },
    new Person() { FirstName = "John", LastName = "Doe", Age = 23, HomeProvince = "Alberta" },
    new Person() { FirstName = "Alex", LastName = "DeLarge", Age = 19, HomeProvince = "British Columbia" },
    new Person() { FirstName = "Travis", LastName = "Bickle", Age = 42, HomeProvince = "Quebec" },
    new Person() { FirstName = "Ferris", LastName = "Beuller", Age = 17, HomeProvince = "Manitoba" },
    new Person() { FirstName = "Maggie", LastName = "May", Age = 23, HomeProvince = "Ontario" },
    new Person() { FirstName = "Mickey", LastName = "Mouse", Age = 93, HomeProvince = "Alberta" },
    new Person() { FirstName = "Frank", LastName = "Darabont", Age = 49, HomeProvince = "Ontario" }
};
2个回答

5
你可以这样做:
// Provinces in the desired order
string[] provinces = { "Ontario", "Quebec", "Alberta", "Manitoba", 
                       "British Columbia" };

var query = from province in provinces
            join person in people on province equals person.HomeProvince
            select person;

这基本上会:

  • 忽略不在指定省份的人
  • 按照指定的省份顺序返回一系列人员

如果您需要按省份分组的人员,那也很容易:

var query = from province in provinces
            join person in people on province equals person.HomeProvince
                into grouped
            select new { Province = province, People = grouped.ToList() };

另一个选项是创建一个从省份到“优先级”的映射,然后根据其排序。实际输出的结果取决于您需要什么。


0

我不确定这是否是最好的方法,但我可能会将所有家乡省份为安大略省的人添加到数组中。然后重复这个过程,对于魁北克省等其他省份也是如此... 我不知道还有什么其他方法,因为你需要的是“随机”的。

我说数组,因为这是你在代码示例中使用的容器。显然,只要你在放入或放入后不对它们进行排序,使用什么类型的容器都无所谓。


是的,我猜想可能需要一个委托方法来实现自定义排序规则,但是该如何做呢?我对C#特别是Linq还很新。 - LYF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接