2016-08-31 2 views
2

Ich entwickle eine kleine Musik-Anwendung, wo ich eine Dropdown-Liste füllen.LINQ Abfrage für die Bestellung von einer bestimmten Set-Liste

ist mein Problem in der LINQ-Abfrage, die ich laufen hier:

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

Meine Werte für die ChordKey sind immer nur sein würde:

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

ich sie möchte bestellt wie sie oben sind, erscheint leider A vor Ab usw., wenn alphabetisch geordnet. Gibt es eine Möglichkeit, sie nach dem oben genannten Standard zu bestellen?

+0

Was ist der Unterschied zwischen C# und Db? Wie wäre es mit F # und Gb? –

+0

Was ist, wenn Sie die Klasse 'ChordKey' erstellen und' IComparer' zum Sortieren dieser Klassen implementieren? – feeeper

+0

@CharlesBretana Sie sind im Klang gleich, aber sie können auf Akkordblättern unterschiedlich gelesen werden –

Antwort

1

Sie können eine benutzerdefinierte sotring Liste, die Sie seine Einzelteile bestellen bestellen Ihre speziellen Liste verwenden können. Dies kann durch Erstellen einer Liste der benutzerdefinierten Reihenfolge und Verwendung des Index jedes Elements in dieser Liste erfolgen. Wenn es ChordKey Werte, die nicht in der Liste sein kann (nicht den Fall scheint, dann werden Sie eine weitere Überprüfung benötigen):

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(); 

Dieser jedes Objekt in der Liste anordnet durch den Index des Elements in Ihre Sortierliste.

3

Verwenden Sie eine Aufzählung für die Schlüssel mit zugrunde liegenden Integralwerten, die nach Ihren Wünschen sortiert werden.

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} 

dann

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

Funktioniert das wirklich bei der Abfrage gegen die Datenbank? – user3185569

0

Eine andere Lösung ist die Klasse erstellen ChordKey und implementieren IComparer Schnittstelle:

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; 
    } 
} 

Jetzt können Sie es in Ihre LINQ-Abfragen verwenden:

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