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

LYF*_*LYF 3 linq

我需要根据对象的属性类别对对象列表进行查询.我需要这些组的顺序不是我在许多其他样本中看到的通常的字母顺序.我正在使用我从其他地方带来的一个例子.如何基于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" }
};
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 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;
Run Code Online (Sandbox Code Playgroud)

那将基本上:

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

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

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

另一个选择是创建从省到"优先级"的映射,然后按顺序排序.这实际上取决于您需要的输出.