Условное сокращение в C # похоже на ключевое слово SQL in - PullRequest
11 голосов
/ 28 августа 2008

В 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), поэтому я бы хотел, чтобы они были как можно более короткими.

Ответы [ 8 ]

13 голосов
/ 28 августа 2008

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

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
}

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

4 голосов
/ 28 августа 2008

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

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

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

2 голосов
/ 28 августа 2008

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

List<int> allowedIDs = ...;

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

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

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

1 голос
/ 28 августа 2008

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

Например, enum UserRole { Пользователь, Администратор, 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 голосов
/ 28 августа 2008

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

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;
}
0 голосов
/ 28 августа 2008

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

return new [] { Personnel.JohnDoe, Personnel.JaneDoe }.Contains(userID);
0 голосов
/ 28 августа 2008

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

using System.Linq;
public static bool IsAllowed(int userID)
{
  return new Personnel[]
      { Personnel.JohnDoe, Personnel.JaneDoe }.Contains((Personnel)userID);
}
0 голосов
/ 28 августа 2008

Хорошая маленькая хитрость заключается в том, чтобы перевернуть способ, которым вы обычно используете .Contains (), например: -

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

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

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

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