我们有一个包含国家/地区名称的列表。我们需要从列表b / w两个字母中找到国家/地区的名称。与名称以b / w A-G开头的所有国家/地区的名称相同,依此类推。我们创建以下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>();
完成上述任务的任何帮助或任何其他有效方法?
答案 0 :(得分:10)
var countryAG = from elements in countryList
where elements[0] >= 'A' && elements[0] <= 'H'
select elements;
Chars只是数字,所以你可以比较它们
答案 1 :(得分:2)
尝试
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
的信息,请参阅here。
答案 2 :(得分:2)
我现在无法测试,但我会尝试
countryList.Where((s) => s[0] <= 'A' && s[0] >= 'G');
答案 3 :(得分:1)
您可以使用前缀列表然后使用前缀列表进行比较 - 这样您就可以根据您感兴趣的范围轻松使用不同的前缀列表:
List<string> prefixList = new List<string>() { "A", "B", "C", "D", "E", "F", "G" };
var countryAG = countryList.Where( x=> prefixList.Any( p => x.StartsWith(p)));
答案 4 :(得分:1)
尝试使用此代码:
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'是静态的例子。
答案 5 :(得分:0)
我有两个扩展功能:
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')))