11 Stimmen

Shorthand-Bedingung in C# ähnlich dem SQL-Schlüsselwort 'in'

Gibt es in C# eine Kurzschrift, um dies zu schreiben:

public static bool IsAllowed(int userID)
{
    return (userID == Personnel.JohnDoe || userID == Personnel.JaneDoe ...);
}

Wie:

public static bool IsAllowed(int userID)
{
    return (userID in Personnel.JohnDoe, Personnel.JaneDoe ...);
}

Ich weiß, dass ich auch switch verwenden könnte, aber es gibt wahrscheinlich 50 oder so Funktionen wie diese, die ich schreiben muss (Portierung einer klassischen ASP-Website auf ASP.NET), also möchte ich sie so kurz wie möglich halten.

13voto

Jon Sagara Punkte 1050

Wie wäre es damit?

public static class Extensions
{
    public static bool In<T>(this T testValue, params T[] values)
    {
        return values.Contains(testValue);
    }
}

Verwendung:

Personnel userId = Personnel.JohnDoe;

if (userId.In(Personnel.JohnDoe, Personnel.JaneDoe))
{
    // Do something
}

Ich kann nicht behaupten, dass dies mein Verdienst ist, aber ich kann mich auch nicht erinnern, wo ich es gesehen habe. Das Lob gebührt also dir, anonymer Internetfremder.

4voto

Yaakov Ellis Punkte 39402

Wie wäre es mit so etwas wie diesem:

public static bool IsAllowed(int userID) {
  List<int> IDs = new List<string> { 1,2,3,4,5 };
  return IDs.Contains(userID);
}

(Sie könnten natürlich den statischen Status ändern, die IDs-Klasse an einer anderen Stelle initialisieren, eine IEnumerable<> verwenden, usw., je nach Ihren Bedürfnissen. Der wichtigste Punkt ist, dass das engste Äquivalent zur in Operator in SQL ist die Funktion Collection.Contains()).

2voto

Frank Krueger Punkte 67044

Ich würde die Liste der zulässigen IDs kapseln als Daten no Code . Dann kann die Quelle später leicht geändert werden.

List<int> allowedIDs = ...;

public bool IsAllowed(int userID)
{
    return allowedIDs.Contains(userID);
}

Wenn Sie .NET 3.5 verwenden, können Sie IEnumerable anstelle von List dank der Erweiterungsmethoden.

(Diese Funktion sollte nicht statisch sein. Siehe diesen Beitrag: Ist es gut oder schlecht, zu viel statische Elektrizität zu verwenden? .)

1voto

Pauly Punkte 158

Basieren die Berechtigungen auf einer Benutzerkennung? Wenn ja, könnten Sie eine bessere Lösung finden, wenn Sie zu rollenbasierten Berechtigungen wechseln. Oder Sie müssen diese Methode häufig bearbeiten, um weitere Benutzer in die Liste der "zugelassenen Benutzer" aufzunehmen.

Zum Beispiel, enum UserRole { Benutzer, Administrator, LordEmperor }

class User {
    public UserRole Role{get; set;}
    public string Name {get; set;}
    public int UserId {get; set;}
}

public static bool IsAllowed(User user) {
    return user.Role == UserRole.LordEmperor;
}

0 Stimmen

Ich würde das gerne tun, aber leider stecken wir viel zu tief in veraltetem Code.

0voto

ljs Punkte 35909

Ein netter kleiner Trick ist es, die Art und Weise, wie Sie normalerweise .Contains() verwenden, umzukehren.

public static bool IsAllowed(int userID) {
  return new int[] { Personnel.JaneDoe, Personnel.JohnDoe }.Contains(userID);
}

Sie können so viele Einträge in das Array aufnehmen, wie Sie möchten.

Wenn die Personnel.x ein Enum ist, hätten Sie einige Casting-Probleme mit diesem (und mit dem ursprünglichen Code, den Sie gepostet haben), und in diesem Fall wäre es einfacher zu verwenden: -

public static bool IsAllowed(int userID) {
  return Enum.IsDefined(typeof(Personnel), userID);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X