Убедитесь, что строка не начинается с каких-либо букв из списка <string> - PullRequest
0 голосов
/ 27 сентября 2018

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

var dir = "FOLDERNAME";
var list = new List<string>() { "a", "b", "c", "d", "e", "f", "g", "s", 
                                "t", "u", "v", "w", "z", "y", "z", 
                                "1", "2", "3", "4", "5", "6", "7", "8", "9"};
if (!dir.ToLower().!StartsWith :MagicLinq: list) { Do Stuff; }

Или я должен идти по маршруту регулярных выражений?

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Если эта проверка будет выполняться много раз, использование HashSet<> будет более эффективным, чем линейный поиск для List<>.Даже если производительность не имеет значения, HashSet<> может лучше представлять данные и то, как они используются, поскольку каждый элемент уникален, а порядок не имеет значения.

Здесь я использую HashSet<> из char s ...

var dir = "FOLDERNAME";
var restrictedChars = new HashSet<char>(
    new[] {
        'A', 'B', 'C', 'D', 'E', 'F', 'G',
        'S', 'T', 'U', 'V', 'W', 'Z', 'Y', 'Z',
        '1', '2', '3', '4', '5', '6', '7', '8', '9'
    }
);

if (!restrictedChars.Contains(dir[0]))
{
    // Do stuff...
}

Обратите внимание, что я поменял ограниченные символы с строчных на прописные, поскольку char.ToUpper() / char.ToUpperInvariant() являются рекомендуемый способ нормализации регистра для сравнения без учета регистра.Затем вы можете выполнить проверку без учета регистра, как это ...

if (!restrictedChars.Contains(char.ToUpperInvariant(dir[0])))
{
    // Do stuff...
}

В качестве альтернативы, вы можете использовать HashSet<> из string с и передать без учета регистра StringComparer экземпляр ...

var dir = "FOLDERNAME";
var restrictedChars = new HashSet<string>(
    new[] {
        "a", "b", "c", "d", "e", "f", "g",
        "s", "t", "u", "v", "w", "z", "y", "z",
        "1", "2", "3", "4", "5", "6", "7", "8", "9"
    },
    StringComparer.OrdinalIgnoreCase
);

// Get a string from Substring() instead of dir[0].ToString()
if (!restrictedChars.Contains(dir.Substring(0, 1)))
{
    // Do stuff...
}

При таком подходе регистр ограниченного символа string с, введенного в HashSet<>, не имеет значения.

0 голосов
/ 27 сентября 2018

Один подход к рассмотрению:

var lower = new string(dir?.FirstOrDefault() ?? new char(), 1);
if (list.Contains(lower) {

Первая строка получает первый символ из строки и обрабатывает пустые строки и null (получая нулевой символ), а затем загружает это char в string.

Вы могли бы упростить это, если бы вместо List<string> было List<char или HashSet<char>.Тогда вы можете удалить new string часть.

0 голосов
/ 27 сентября 2018

Вот как бы я это сделал

String dir = "FOLDERNAME";
var MyList = new List<string>() { "a", "b", "c", "d", "e", "f", "g", "s",
                "t", "u", "v", "w", "z", "y", "z",
                "1", "2", "3", "4", "5", "6", "7", "8", "9"};
Console.WriteLine((MyList.IndexOf(dir.Substring(0, 1).ToLower()) != -1) ? "True" : "False");
Console.ReadLine();
0 голосов
/ 27 сентября 2018

Вы можете проверить, есть ли первая буква в списке:

if (list.Contains(""+dir[0])){}
...