Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询-基于第一个字母b/w两个范围查找字符串_C#_Linq_Letters - Fatal编程技术网

C# Linq查询-基于第一个字母b/w两个范围查找字符串

C# Linq查询-基于第一个字母b/w两个范围查找字符串,c#,linq,letters,C#,Linq,Letters,我们有一份国家名单。我们需要从带有两个字母的列表中找到国家的名称。像所有以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

我们有一份国家名单。我们需要从带有两个字母的列表中找到国家的名称。像所有以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>();
有什么帮助或其他有效的方法来完成上述任务吗?

试试看

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的信息,请参阅。

我现在无法测试它,但我会尝试

countryList.Where((s) => s[0] <= 'A' && s[0] >= 'G');

您可以使用前缀列表,然后使用前缀列表进行比较-通过这种方式,您可以根据您感兴趣的范围轻松使用不同的前缀列表:

 List<string> prefixList = new List<string>() { "A", "B", "C", "D", "E", "F", "G" };
 var countryAG = countryList.Where( x=> prefixList.Any( p => x.StartsWith(p)));
字符实际上只是数字,因此您可以对它们进行比较

尝试使用以下代码:

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);

例如,“开始”和“结束”是静态的。

我有两个扩展函数:

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]。在range'a',f'

中,我们可以假设国家名称是英文的,我们可以使用英文排序顺序吗?该查询无法编译,您忘记了选择。谢谢@Steven,但在生成过程中出现以下错误:查询体必须以select子句或组结尾clause@svick,我应该在哪里添加select?功能非常强大。谢谢@Steven.工作很有魅力。谢谢@svick的所有帮助。谢谢@break,但这与我目前的方法相同。我对写所有英文字母不感兴趣。谢谢@Yahia,但这和我目前的方法一样。我对写所有英文字母不感兴趣。很抱歉读到这一点-你要求一个更有效的方法。。。我敢打赌,我的答案中的查询比您当前使用的查询运行得更快,因此我建议使用它…抱歉@Yahia。我忽略了效率方面,因为我在构建简单的东西,而忽略了效率部分。再次抱歉。还有,我们有没有办法使事情变得简单和有效。场景很简单,我们有国家名称的列表,我们必须将它们分为A-G、I-P和Q-Z。我认为Linq是快速而简单的。请你想想。使用正则表达式听起来很有趣。我要试试这个。感谢您的回复。您可以使用IsMatch而不是Match.Success。
public static bool In(this string source, IEnumerable<string> collection)
{
  return collection.Contains(source);
}