我正在开发一个小音乐应用程序,我正在填写一个下拉列表。
我的问题出在我在这里运行的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
等之前,如果按字母顺序排序。有没有办法按照上面的具体标准订购?
答案 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();