Сокращенное условное обозначение в C #, аналогичное ключевому слову SQL 'in'
-
09-06-2019 - |
Вопрос
В 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);