LINQ按本地列表排序

时间:2013-07-30 09:08:58

标签: c# .net linq linq-to-sql

我从数据库中列出了“公司”。

然后我有另一本词典:

Dictionary<int, string> ordering = new Dictionary<int, string>();
ordering.Add(1, "VIP");
ordering.Add(2, "VIP+");
ordering.Add(3, "Regular");

公司名单必须由此词典订购。

我该怎么做?

我无法加入'公司'字典'订购',如果我这样做,我会得到例外。

有没有办法通过'订购'键'排序'。

字典值(vip,vip +,regular)与我公司列表中的列对应。

3 个答案:

答案 0 :(得分:1)

您的订购字典看起来就像您需要使用它的方式一样是从前到后,这是基于文本键查找并提供数字排序。我建议首先“反转”您的订购字典,然后您可以对公司进行排序,以获得每个条目的字典查找成本,以及LINQ排序算法的成本。

var swappedOrdering = ordering.ToDictionary(kvp => k.Value, kvp => k.Key);
var orderedCompanies = companies.OrderBy(c => ordering[c.CompanyCategory]);

请记住,虽然您的订购字典是内存,而不是数据库,但是为了使用这种方法,您需要将所有记录回送到内存中。如果您希望数据库执行繁重的工作,则必须将此订购信息放入数据库中。

答案 1 :(得分:0)

除了Jon G所说的,您还可以通过加入来实现。这样的事情可以解决问题:

var companyQuery = from c in companies
                   join kvp in ordering on c.CompanyCategory equals kvp.Value
                   orderby kvp.Key
                   select c;

答案 2 :(得分:0)

您可以使用自定义的OrderBy语句,如:

public List<Company> OrderCompanies()
{
    Dictionary<int, string> ordering = new Dictionary<int, string>();
    ordering.Add(1, "VIP");
    ordering.Add(2, "VIP+");
    ordering.Add(3, "Regular");

    // This could be the database source
    List<Company> companies = new List<Company>();
    companies.Add(new Company() { CompanyCategory = "VIP" });
    companies.Add(new Company() { CompanyCategory = "VIP+" });

    return companies
        .OrderBy(company => ordering.First(pair => pair.Value == company.CompanyCategory).Key)
        .ToList();
}