it-swarm.com.de

Wie führe ich eine LINQ-Abfrage über Enum durch?

Unten ist mein Enumerator List:

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 3,
    Started = 4,
    Completed = 5,
    Cancelled = 6,
    Assigned = 7
}

Ich muss dies an ein Combobox binden, aber nur einige bestimmte Status anzeigen und den Rest ignorieren.

Das habe ich bisher:

public static List<Activity.StatusEnum> StatusList()
{
        IEnumerable<Activity.StatusEnum> query = Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>()
                        .Where(x => x == Activity.StatusEnum.Open
                            || x == Activity.StatusEnum.Rejected
                            || x == Activity.StatusEnum.Accepted
                            || x == Activity.StatusEnum.Started);
        return query.ToList();
}

Ich habe jedoch das Gefühl, dass der Code ein wenig chaotisch ist und keine korrekte Methode zum Binden der gefilterten Enum -Liste an eine Combobox ist. Kann jemand eine robustere Methode vorschlagen, um dies zu tun?

Aktualisieren

Möglicherweise muss ich die Reihenfolge der Auswahl ändern. Ich brauche also eine generische Lösung, die nicht nur die erste X-Anzahl von Status erhält.

28
Learner

Wenn Sie die Elemente, die sowieso in der Liste enthalten sein sollten, hart codieren möchten, tun Sie dies einfach:

public static List<Activity.StatusEnum> StatusList()
{
    return new List<Activity.StatusEnum>
    { 
        Activity.StatusEnum.Open, 
        Activity.StatusEnum.Rejected, 
        Activity.StatusEnum.Accepted, 
        Activity.StatusEnum.Started 
    };
}

Sie können auch List<T> Löschen und das Array selbst zurückgeben. Solange Sie wissen, dass dies die gewünschten Elemente sind, ist Linq nicht erforderlich.

11
p.s.w.g
return Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>().Where((n, x) => x < 4);

Wenn Sie die Liste der Elemente ändern möchten, fügen Sie sie einfach in ein List<Activity.StatusEnum> und benutze Contains:

var listValid = new List<Activity.StatusEnum>() { Activity.StatusEnum.Open, Activity.StatusEnum.Rejected, Activity.StatusEnum.Accepted, Activity.StatusEnum.Started };
return Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>().Where(n => listValid.Contains(n));
38
It'sNotALie.

Schritte:

  • Rufen Sie die Werte für enum ab und wandeln Sie die Ergebnisse in den Typ des enum um.
  • Sortiere die enum Werte nach ihren ganzzahligen Werten (ansonsten sortieren sie natürlich nach vorzeichenloser Größe)
  • Nimm die ersten 4

Code:

return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.OrderBy(se =>(int)se)
.Take(4);

Ausgabe:

Öffnen Sie Abgelehnt Akzeptiert Gestartet

7
Stephen Kennedy

Erstens, wenn möglich, würde ich Ihre Aufzählung zu Potenzen von 2 machen, damit sie zusammen ODER-verknüpft werden können.

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 4,
    Started = 8,
    Completed = 16,
    Cancelled = 32,
    Assigned = 64
}

Dann könnten Sie so etwas tun:

public static List<Activity.StatusEnum> StatusList()
{
    var statusesToShow = Activity.StatusEnum.Open | Activity.StatusEnum.Rejected | Activity.StatusEnum.Accepted | Activity.StatusEnum.Started;

    return Enum
        .GetValues(typeof(Activity.StatusEnum))
        .Cast<Activity.StatusEnum>()
        .Where(x => (x & statusesToShow) == x)
        .ToList();
}

EDIT : Angesichts der Tatsache, dass Sie die Aufzählungswerte nicht ändern können, würde ich nur empfehlen, Folgendes zu verwenden:

public static List<Activity.StatusEnum> StatusList()
{
    return new List<Activity.StatusEnum> {
        Activity.StatusEnum.Open, 
        Activity.StatusEnum.Rejected, 
        Activity.StatusEnum.Accepted, 
        Activity.StatusEnum.Started
    };
}
6
Chris Doggett

"... nur die ersten 4 Status anzeigen und den Rest ignorieren."

So erhalten Sie die ersten n Elemente eines IEnumerable<T>, benutze die Take Methode:

return Enum.GetValues(typeof(Activity.StatusEnum))
    .Cast<Activity.StatusEnum>()
    .Take(4)
    .ToList();
5
Timothy Shields

Wie wäre es mit etwas in der Art von:

.Where(x => x <= Activity.StatusEnum.Started)
3
John Bustos