使用自定义订单

时间:2016-03-04 20:03:03

标签: c# linq

我有一个项目列表,我知道我可以按属性名称按字母顺序排序,但我怎么能按实际值而不是属性来订购它们。

为了澄清,我们说我有这段代码:

List<string> lstNames = db.TestDB.Where(x => x.TestCode == true).Select(x => x.FavoriteName).ToList();

现在我知道我可以按FavoriteName按字母顺序排序,反之亦然,但为了论证,我们可以说数据库中的名称为"Nick""Adam""Chris"如果我使用OrderBy方法:

List<string> lstNames = db.TestDB.Where(x => x.TestCode == true).Select(x => x.FavoriteName).OrderBy(x => x.FavoriteName).ToList();

这将按字母顺序列出名称"Adam""Chris""Nick",反之亦然:

List<string> lstNames = db.TestDB.Where(x => x.TestCode == true).Select(x => x.FavoriteName).OrderBy(x => x.FavoriteName).OrderByDescending(x => x.FavoriteName).ToList();

但如果我想将它们命名为"Chris""Adam""Nick"该怎么办?

基本上我正在寻找一种自定义方式来按实际值排序列表,而不是属性名称?

此外,我的数据库中的这些值将不会更改,我怀疑是否会添加/删除..所以我也尝试将所有值放入他们自己的列表中并尝试使用该列表的OrderBy方法但它不起作用。

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

您可以创建自定义比较器进行排序:

public class MyComparer : IComparer<string>
{
    public int Compare(string stringA, string stringB)
    {
        // your comparison logic
        // return 1 if stringA "is greater than" stringB
        // return -1 if stringA "is less than" stringB
        // return 0 if they are equal
    }
}

在订购时使用它:

lstNames.OrderBy(x => x, instanceOfMyComparer)

在问题中给出的示例中定义您的排序的比较逻辑对我来说并没有多大意义。但这并不是特别重要。无论您想要使用什么逻辑,都只需使用Compare()方法。

答案 1 :(得分:0)

如果排序是任意的,但您知道它应该是什么,我建议您在数据库中添加另一个表,其中包含FavoriteName和订单#,加入该表然后对结果进行排序。

如果您不想在数据库中执行此操作,则可以通过对其进行硬编码来完成相同的操作,如下所示:

var nameOrder = new[] { 
    new {Name = "Chris", Order = 1}
    , new {Name = "Adam", Order = 2}
    , new {Name = "Nick", Order = 3}
};

lstNames.Join(nameOrder, lstName => lstName, nameOrd => nameOrd.Name, (Name, nameOrd) => new { Name, nameOrd.Order }).OrderBy(o => o.Order);