Запрос Linq - поиск строк по первой букве ч / б в двух диапазонах
У нас есть список, содержащий названия стран. Нам нужно найти названия стран из списка ч / б двумя буквами. Как и названия всех стран с именем, начинающимся с ч / б AG и так далее. Мы создаем следующий запрос linq, но он уродлив.
var countryAG = from elements in countryList
where elements.StartsWith("A") ||
elements.StartsWith("B") ||
elements.StartsWith("C") ||
elements.StartsWith("D") ||
elements.StartsWith("E") ||
elements.StartsWith("F") ||
elements.StartsWith("G") ||
elements.StartsWith("H")
select elements;
где countryList создается в C#
List< string> countryList = new List< string>();
Любая помощь или любой другой эффективный способ выполнить вышеупомянутую задачу?
8 ответов
var countryAG = from elements in countryList
where elements[0] >= 'A' && elements[0] <= 'H'
select elements;
Символы на самом деле просто числа, поэтому вы можете сравнить их как таковые
Вы можете использовать список префиксов, а затем использовать список префиксов для сравнения - таким образом, вы можете легко использовать разные списки префиксов в зависимости от диапазона, который вас интересует:
List<string> prefixList = new List<string>() { "A", "B", "C", "D", "E", "F", "G" };
var countryAG = countryList.Where( x=> prefixList.Any( p => x.StartsWith(p)));
Я не могу проверить это прямо сейчас, но я бы попробовал
countryList.Where((s) => s[0] <= 'A' && s[0] >= 'G');
Пытаться
char[] startingLetters = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
var countryAG =
from elements in countryList
where elements.IndexOfAny(startingLetters, 0, 1) == 0
select elements;
Смотрите здесь для получения информации о IndexOfAny
,
Попробуйте использовать этот код:
var start = "a";
var end = "g";
var regex = new Regex(string.Format("^[{0}-{1}]", start, end));
var result = list.Where(x => regex.Match(x.ToLowerInvariant()).Success);
'start' и 'end' являются статическими в качестве примера.
У меня есть две функции расширения:
public static IEnumerable<char> Range(char start, char end)
{
return Enumerable.Range((int)start, (int)end - (int)start + 1).Select(i => (char)i);
}
который создает диапазон символов, и
public static bool In(this string source, IEnumerable<string> collection)
{
return collection.Contains(source);
}
который является только обратной Contains
В основном для удобства чтения.
Вместе я могу сделать:
where elements[0].In(Range('a', 'f')))
List<string> mainList = new List<string>()
{
"A","B","DD","EE","F","G","EE","CC","DD","Q","R","CC"
};
List<string> searchList = new List<string>() { "DD", "EE", "CC" };
var finalList = mainList.Where(x => searchList.Any(p => p == x)).ToList();
Два способа фильтрации списка по первой букве строки:
-
list = list.Where(x => x.WordText.ToUpper().StartsWith(Character));
-
list = list.Where(x => Regex.IsMatch(x.WordText.ToUpper().Substring(0, 1), Character));