Есть ли лучший способ написать новый список <string>{"a", "b"}. Содержит (str)? - PullRequest
1 голос
/ 27 августа 2009

Я хочу проверить, содержится ли определенная строка в коротком списке строк. В настоящее время код выглядит так:

if (new List<string> { "A", "B", "C" }.Contains (str)) {

Однако это кажется раздутым. Например, iirc, в Java я мог бы просто написать {"A", "B", "C"}.Contains(str), что было бы намного предпочтительнее вышеупомянутого.

Я уверен, что в C # есть лучший способ. Не могли бы вы указать на это?

Ответы [ 5 ]

6 голосов
/ 27 августа 2009

Вы можете написать метод расширения:

public static bool In<T>(this T obj, params T[] candidates)
{
    return obj.In((IEnumerable<T>)candidates);
}

public static bool In<T>(this T obj, IEnumerable<T> candidates)
{
    if(obj == null) throw new ArgumentNullException("obj");
    return (candidates ?? Enumerable.Empty<T>()).Contains(obj);
}

Что вы могли бы затем использовать для:

if(str.In("A", "B", "C")) { ... }
6 голосов
/ 27 августа 2009

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

if ((new []{ "A", "B", "C" }).Contains (str)) {

Не знаю, насколько реально это изменится.

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

if ("ABC".Contains(str)) {

Этот код и короче, и быстрее. Но опять же, я предполагаю, что однобуквенные строки были просто образцами ...

2 голосов
/ 27 августа 2009

Чтобы полностью изменить это:

switch(str){
    case "A":
    case "B":
    case "C":
       contains = true;
       break;

    default:
       contains = false;
       break;
}
2 голосов
/ 27 августа 2009

Если ваш короткий список строк постоянен, вы должны использовать статический массив строк только для чтения.

Преимущество заключается в том, что его легко написать, и он не создает новый список каждый раз, когда вам нужно выполнить проверку.

private static readonly string[] Names = new string[] { "A", "B", "C" };

...

if (Names.Contains(str)) {

Однако это решение не масштабируется, так как поиск выполняется линейным способом. Кроме того, вы можете определить свой постоянный массив отсортированным образом и использовать BinarySearch над массивом.

// this has to be sorted
private static readonly string[] Names = new string[] { "A", "B", "C" };

...

if (Array.BinarySearch(Names, str) >= 0) {
2 голосов
/ 27 августа 2009

А как насчет этого подхода:

"A;B;C".Split(';').Contains(str);
...