Сравнение нескольких строк с С#

Скажем, мне нужно сравнить, если строка x равна "A", "B" или "C".

С Python я могу использовать в операторе, чтобы легко это проверить.

if x in ["A","B","C"]:
    do something

С С# я могу сделать

if (String.Compare(x, "A", StringComparison.OrdinalIgnoreCase) || ...)
    do something

Может ли это быть чем-то более похожим на Python?

ADDED

Мне нужно было добавить System.Linq для использования нечувствительного к регистру Contain().

using System;
using System.Linq;
using System.Collections.Generic;

class Hello {
    public static void Main() {
        var x = "A";

        var strings = new List<string> {"a", "B", "C"};
        if (strings.Contains(x, StringComparer.OrdinalIgnoreCase)) {
            Console.WriteLine("hello");
        }
    }
}

или

using System;
using System.Linq;
using System.Collections.Generic;

static class Hello {
    public static bool In(this string source, params string[] list)
    {
        if (null == source) throw new ArgumentNullException("source");
        return list.Contains(source, StringComparer.OrdinalIgnoreCase);
    }

    public static void Main() {
        string x = "A";

        if (x.In("a", "B", "C")) {
            Console.WriteLine("hello");
        }
    }
}

Ответы

Ответ 1

Используйте Enumerable.Contains<T>, который является методом расширения на IEnumerable<T>:

var strings = new List<string> { "A", "B", "C" };
string x = // some string
bool contains = strings.Contains(x, StringComparer.OrdinalIgnoreCase);
if(contains) {
    // do something
}

Ответ 2

if ((new[]{"A","B","C"}).Contains(x, StringComparer.OrdinalIgnoreCase))

Ответ 3

Почему да, там есть классический поток на StackOverflow с расширением, который будет делать именно то, что вы ищете.

Использование методов расширения

public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

EDIT в ответ на комментарий ниже: Если вас интересуют только строки, то:

public static bool In(this string source, params string[] list)
{
    if (null == source) throw new ArgumentNullException("source");
    return list.Contains(source, StringComparer.OrdinalIgnoreCase);
}

Что приводит к синтаксису, с которым вы знакомы:

if(x.In("A","B","C"))
{
  // do something....
}

Обратите внимание: это почти то же самое, что и все остальные, опубликованные только в синтаксисе, близком к тому, что вы упомянули.

Ответ 4

List<string> possibleMatches = new List<string>{"A", "B", "C"};
possibleMatches.Contains(inputString);

Ответ 5

Конечно,

var lst = new List<string>() { "A", "B", "C" };
if (lst.Contains(x, StringComparer.OrdinalIgnoreCase) {
   // do something
}

Ответ 7

Есть несколько подходов к этому, я бы предложил вам сделать что-то вроде:

 private const string _searched = "A|B|C|";
        private void button1_Click(object sender, EventArgs e)
        {
            string search = "B" + "|";
            if (_searched.IndexOf(search) > -1)
            {
                //do something
            }
        }

Есть много других способов справиться с этим, и чем больше поле поиска, тем больше вероятность использования массива, хэш-таблица или коллекция становятся ценными. Пока ваше поле возможностей остается небольшим, использование простой строки будет вашей лучшей производительностью. Все накладные расходы более сложных массивов или объектов (или массивов объектов...) не нужны.