Сокращенное условное обозначение в C #, аналогичное ключевому слову SQL 'in'

StackOverflow https://stackoverflow.com/questions/32937

Вопрос

В C # есть ли сокращенный способ написать это:

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

Нравится:

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

Я знаю, что я мог бы также использовать switch, но, вероятно, есть около 50 подобных функций, которые мне нужно написать (перенос классического сайта ASP на ASP.NET), поэтому я хотел бы сделать их как можно короче.

Это было полезно?

Решение

Как насчет этого?

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

Использование:

Personnel userId = Personnel.JohnDoe;

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

Я не могу приписать это себе, но я также не могу вспомнить, где я это видел.Итак, отдаю должное тебе, анонимный интернет-незнакомец.

Другие советы

Как насчет чего-то вроде этого:

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

(Вы, конечно, могли бы изменить статический статус, инициализировать класс IDs в каком-нибудь другом месте, использовать IEnumerable<> и т.д., в зависимости от ваших потребностей.Главный момент заключается в том, что ближайший эквивалент в оператор в SQL - это коллекция.Содержит функцию().)

Я бы инкапсулировал список разрешенных идентификаторов следующим образом данные нет код.Тогда его источник можно будет легко изменить позже.

List<int> allowedIDs = ...;

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

Если вы используете .NET 3.5, вы можете использовать IEnumerable вместо того, чтобы List благодаря методам расширения.

(Эта функция не должна быть статичной.Смотрите эту публикацию: использование слишком большого количества статики плохо или хорошо?.)

Основаны ли разрешения на идентификаторе пользователя?Если это так, вы можете найти лучшее решение, перейдя в раздел разрешения на основе ролей.Или же вам может потребоваться довольно часто редактировать этот метод, чтобы добавить дополнительных пользователей в список "разрешенные пользователи".

Например, перечислите UserRole { Пользователь, Администратор, Лорд-император }

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

Приятный маленький трюк заключается в том, чтобы изменить способ, которым вы обычно пользуетесь .Содержит (), например:-

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

Где вы можете поместить в массив столько записей, сколько захотите.

Если Personnel.x является перечислением, у вас возникли бы некоторые проблемы с приведением этого (и с исходным кодом, который вы опубликовали), и в этом случае его было бы проще использовать:-

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

Вот самое близкое, что я могу придумать:

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

Можете ли вы написать итератор для персонала?

public static bool IsAllowed(int userID)
{
    return (Personnel.Contains(userID))
}

public bool Contains(int userID) : extends Personnel (i think that is how it is written)
{
    foreach (int id in Personnel)
        if (id == userid)
            return true;
    return false;
}

Просто еще одна синтаксическая идея:

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top