2012-02-15 2 views
6

Я думаю, что был в оператор в Commodore 128 Basic.
Есть ли у оператора в C# тоже?у оператора в C#

Я имею в виду есть оператор любезного

if(aString in ["a", "b", "c"]) 
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'"); 

Edit1: В настоящее время мне это нужно, чтобы решить, если значение перечисления находится в диапазоне от некоторых значений перечислений.

Редактировать2: Спасибо всем за решения Contains(). Я буду использовать его в будущем. Но в настоящее время у меня есть потребность в значениях перечисления. Можно ли заменить следующий оператор на Contains() или другие методы?

public enum MyEnum { A, B, C } 

class MyEnumHelper 
{ 
    void IsSpecialSet(MyEnum e) 
    { 
    return e in [MyEnum.A, MyEnum.C] 
    } 
} 

Редактировать3: Извините, это был не базовый. Я просто искал походы и нашел Турбо Паскаля в качестве кандидата, где я мог его увидеть. См http://en.wikipedia.org/wiki/Pascal_%28programming_language%29#Set_types

Edit4: Лучшие ответы до сих пор (конец 15 Фев 2012):

  • Для списков и массивов: принято отвечать и все другие ответы с Содержит() решений
  • Для переходов: ответ Канеды с хорошим списком плюсов и минусов для различных методов расширения
+0

на основе кода, вы хотите, чтобы увидеть, если aString равно «а "," b "или" c ", а не содержит ли он" a "," b "или" c ". это правильно? Это были годы, когда я смотрел на Commodor 128 basic, но для меня это похоже на типичный код разветвления, если я правильно помню. – David

+0

Я не помню, что от C-128 BASIC (хотя вы забираете меня назад), но это очень близко к синтаксису python –

+0

Да, нет 'in' в 1980-х годах BASIC, что я помню. –

ответ

11

Попробуйте это:

if(new [] {"a", "b", "c"}.Contains(aString)) 
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'"); 

При этом используется метод Contains для поиска массива для aString.

+0

Есть ли соответствующее решение для перечислений? – brgerner

+0

@brgerner: Это решение будет работать и для перечислений. –

+2

@brgerner: для немного синтаксического сахара (который имеет свои плюсы и минусы), см. Http://stackoverflow.com/a/5320727/1169696 - позволяет делать 'if (MyEnumValue.In (MyEnum.First, MyEnum. Во-вторых, MyEnum.Third)) {...} ' – JimmiTh

1

Большинство коллекций будет иметь метод .Contains, а LINQ также имеет метод Contains, поэтому все, что перечислимо, которое еще не имеет собственного метода contains, получает один из LINQ.

3

Нет, вы можете приблизиться:

if (new [] { "a", "b", "c" }.Contains(aString)) 
    Console.Out.WriteLine("aString is 'a', 'b' or 'c'"); 
+0

@DavidStratton На самом деле я не думаю, что это так. –

1

на основе кода, вы хотите, чтобы увидеть, если aString равно «а», «б» или «в», не ли это содержит "a", "b" или "c". Если я читаю этот вопрос правильно, то:

No. Вместо этого, вы бы использовать переключатель заявление

switch(aString) 
{ 
    case "a:": 
    case "b:": 
    case "b:": 
     Console.Out.WriteLine("aString is 'a', 'b' or 'c'"); 
    default: 
     Console.Out.WriteLine("aString is NOT 'a', 'b' or 'c'"); 
} 
+0

Но его вопрос написан таким образом, чтобы продемонстрировать, как собеседник хочет использовать язык, а не фактические бизнес-цели. – Mzn

3

equivelent в C# будет Contains() (если у вас есть список или массив данных)

var myStuff = new List<string> { "a", "b", "c" }; 
var aString = "a"; 

if(myStuff.Contains(aString)) { 
    //Do Stuff 
} 

что касается in ключевого слова, он имеет другое применение:

var myStuff = new List<string> { "a", "b", "c" }; 
var aString = "a"; 

foreach(string str in myStuff) { 
    //Iteration 0 = a, 1 = b, 2 = c 
} 
1

Используйте метод хранения:

string[] values = { "A", "B", "C" }; 

if (values.Contains("A"))   //True 
    MessageBox.Show("A is there"); 

if (values.Contains("b"))    //false, strings are case sensitive 
    MessageBox.Show("b is there"); 
1

Ключевое слово используется только для foreach. И нет, нет такого оператора, предназначенного для этой цели. Но вы можете использовать встроенные методы типа массива или типа списка, как показано ниже:

 string aString = "a"; 
     string[] strings = new string[] { "a", "b", "c" }; 
     if (strings.Contains(aString)) //Contains here is a Linq extension 
      Console.WriteLine("aString is either a, b, or c"); 

     List<string> stringList = new List<string>() { "a", "b", "c" }; 
     if(stringList.Contains(aString)) //Contains here is a member method 
      Console.WriteLine("aString is either a, b, or c"); 

     if(stringList.IndexOf(aString) != -1) 
      Console.WriteLine("aString is either a, b, or c"); 
3

Вы можете использовать метод расширения, если вы хотите немного более свободно способ работы, так для этого примера клиента и статус товара:

public enum CustomerStatus 
{ 
    Active, 
    Inactive, 
    Deleted 
} 

public class Customer 
{ 
    public CustomerStatus Status { get; set; } 
} 

Используйте следующий метод расширения:

public static class EnumExtensions 
{ 
    public static bool In(this Enum value, params Enum[] values) 
    { 
     return values.Contains(value); 
    } 
} 

, чтобы писать код так:

private void DoSomething() 
{ 
     var customer = new Customer 
     { 
      Status = CustomerStatus.Active 
     }; 

     if (customer.Status.In(CustomerStatus.Active, CustomerStatus.Inactive)) 
     { 
      // Do something. 
     } 
} 
+0

Спасибо! К настоящему времени лучший ответ. – brgerner

+0

Общий метод расширения был бы более полезным: 'public static bool В (это значение T, значения параметра T []) {return values.Contains (value); } '. –

+0

Да, это правда, я сделал это перечислением конкретным, как об этом спросил @brgerner. Другие также разместили примеры с использованием дженериков. –

1

Чтобы ответить на последующий вопрос об ответе Эндрю Хэра, да, можно ограничить метод расширения In единственным перечислением. Не принимайте этот ответ, поскольку Андрей и Тревор ответили на пересмотренный вопрос (и большинство ответило на оригинал ... в любом случае).

Напомним, это то, что я считаю наиболее полезным: https://stackoverflow.com/a/5320727/1169696

Но если вы действительно хотите, чтобы ограничить его, это просто вопрос использования типа перечисления в качестве параметра вместо родовой (или Enum):

// This is the one we want to use our In extension method on: 
public enum FriendlyEnum 
{ 
    A, 
    B, 
    C 
} 

public enum EnemyEnum 
{ 
    A, 
    B, 
    C 
} 

// The extension method: 
public static class FriendlyEnumExtensions 
{ 
    public static bool In(this FriendlyEnum value, params FriendlyEnum[] list) 
    { 
     return list.Contains(value); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     FriendlyEnum friendlyValue = FriendlyEnum.A; 
     EnemyEnum enemyValue  = EnemyEnum.A; 

     // Outputs "True": 
     Console.WriteLine(friendlyValue.In(FriendlyEnum.A, FriendlyEnum.C)); 

     // Outputs "False": 
     Console.WriteLine(friendlyValue.In(FriendlyEnum.B, FriendlyEnum.C)); 

     // All of these will result in compiler errors, 
     // because EnemyEnum is invading some way or another: 
     Console.WriteLine(friendlyValue.In(EnemyEnum.A, EnemyEnum.B)); 
     Console.WriteLine(enemyValue.In(FriendlyEnum.A, FriendlyEnum.B)); 
     Console.WriteLine(enemyValue.In(EnemyEnum.A, EnemyEnum.B)); 
    } 

} 

Мне кажется, что это менее полезно, чем общий, с которым я связан, - или подход Тревора - но там вы идете.

Update

Разница между подходами:

  • Используя метод Тревора, все три микса врага и друга в коде выше, будет принят компилятором (выход будет " True "," False "," False "," False "," True ").

  • Используя общий подход, последний будет принят (и «Истина»), потому что генерики обеспечивают только то, что все параметры (включая this) имеют один и тот же тип. I.e., он не будет принимать смешивание разных перечислений в одном и том же вызове.

  • Один выше, опять же, принимает только одно перечисление, для которого вы разработали метод расширения.

0

Я удивлен, что никто не предложил switch:

class MyEnumHelper 
{ 
    void IsSpecialSet(MyEnum e) 
    { 
     return e in [MyEnum.A, MyEnum.C] 
     switch (e) 
     { 
      case MyEnum.A: 
      case MyEnum.C: 
       return true; 
      default: 
       return false; 
     } 
    } 
} 
2

Попробуйте это:

if ("abc".Contains(aString[0])) 
    Console.WriteLine("aString is 'a', 'b' or 'c'"); 
3

Благодаря мои дни Delphi, я также использовал его в ключевое слово ,Для общего случая в C#, я использую:

public static class Helper 
{ 
    public static bool In<T>(this T t, params T[] args) 
    { 
     return args.Contains(t); 
    } 
    } 
} 

, которые могут быть использованы следующим образом:

var color = Color.Aqua; 
    var b = color.In(Color.Black, Color.Blue); 
    b = "hello".In("hello", "world"); 
Смежные вопросы