LINQ查询按特定集列表排序

时间:2016-08-31 07:14:59

标签: c# linq sql-order-by

我正在开发一个小音乐应用程序,我正在填写一个下拉列表。

我的问题出在我在这里运行的LINQ查询中:

var results = (from x in db.Keys
               where x.SongId == songId
               orderby x.ChordKey ascending
               select x.ChordKey).ToList();

我对ChordKey的价值总是只有:

Ab, A, Bb, B, C, C#, Db, D, Eb, E, F, F#, Gb, G

我希望他们在上面订购,不幸的是A会出现在Ab等之前,如果按字母顺序排序。有没有办法按照上面的具体标准订购?

3 个答案:

答案 0 :(得分:3)

对具有基本积分值的键使用枚举,这些值按您希望的方式排序。

public enum ChordKey 
{Ab=1, A=2, Bb=3, B=4, C=5, 
 Db=6, D=7, Eb=8, E=9, 
 F=10, Gb=11, G=12}

然后

var results = (from x in db.Keys
           where x.SongId == songId
           orderby (int)x.ChordKey ascending
           select x.ChordKey).ToList();

答案 1 :(得分:1)

您可以拥有一个自定义sotring列表,您可以使用其项目顺序来订购您的特定列表。这可以通过创建自定义订单列表并使用该列表中每个项目的索引来完成。如果列表中可能没有ChordKey个值(似乎不是这样,那么您需要进一步检查):

var sortingOrder = new List<string>()
{
    "Ab", "A", "Bb", "B", "C", "C#", "Db", "D", "Eb", "E", "F", "F#", "Gb", "G"
};

results = results.OrderBy(x => sortingOrder.IndexOf(x)).ToList();

按照排序列表中项目的索引命令列表中的每个项目。

答案 2 :(得分:0)

另一种解决方案是创建类ChordKey并实现IComparer接口:

class ChordKey : IComparer {
    // the number of the Chord. For Ab is 1 (or 0), for "G" is 14 (or 13) for example
    public int Id { get; set; } 
    // name of the Chord. For Ab is "Ab"
    public string Name { get; set; }

    public ChordKey(string name, int id) {
        Name = name;
        Id = id;
    }

    public int Compare(object a, object b) {
        var c1 = (ChordKey)a;
        var c2 = (ChordKey)a;

        return c1.Id - c2.Id;
    }
}

现在您可以在LINQ查询中使用它:

var results = (from x in db.Keys
               where x.SongId == songId
               orderby x.ChordKey.Id ascending
               select x.ChordKey).ToList();