【问题标题】:Linq query - find strings based upon first letter b/w two rangesLinq 查询 - 根据第一个字母 b/w 两个范围查找字符串
【发布时间】:2011-11-05 05:21:51
【问题描述】:

我们有一个包含国家名称的列表。我们需要从黑白两个字母的列表中找到国家/地区的名称。就像所有国家的名称一样,名称以黑白 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>();

任何帮助或任何其他有效的方式来完成上述任务?

【问题讨论】:

  • 我们可以假设国家名称是英文的,我们可以使用英文排序吗?

标签: c# linq letters


【解决方案1】:
var countryAG = from elements in countryList
                where elements[0] >= 'A' && elements[0] <= 'H'
                select elements;

字符实际上只是数字,因此您可以这样比较它们

【讨论】:

  • 那个查询不会编译,你忘了select
  • 感谢@Steven,但在构建过程中出现以下错误:查询正文必须以 select 子句或 group 子句结尾
  • @svick,我应该在哪里添加选择?
  • 工作就像一个魅力。谢谢@Steven。
  • 工作就像一个魅力。感谢@svick 的所有帮助。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

     List<string> prefixList = new List<string>() { "A", "B", "C", "D", "E", "F", "G" };
     var countryAG = countryList.Where( x=> prefixList.Any( p => x.StartsWith(p)));
    

    【讨论】:

    • 感谢@Broken,但这与我目前的方法相同。我对写所有英文字母不感兴趣。
    【解决方案4】:

    试试

    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

    【讨论】:

    • 感谢@Yahia,但这与我目前的方法相同。我对写所有英文字母不感兴趣。
    • 很抱歉,您要求一种更有效的方法...我敢打赌,我的答案中的查询比您当前使用的查询运行得更快,因此我建议它...
    • 对不起@Yahia。我在构建“让事情变得简单”时忽略了效率方面,而忽略了“高效”部分。再次抱歉。另外,我们有没有办法“让事情变得简单高效”。场景很简单,我们有国家名称列表,我们必须将它们划分为 A-G、I-P 和 Q-Z。我认为 Linq 又快又容易。请提出您的想法。
    【解决方案5】:

    尝试使用此代码:

    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' 以静态为例。

    【讨论】:

    • 使用正则表达式听起来很有趣。我会试试这个。感谢您的回复。
    • 你可以使用Match().Success,而不是IsMatch()
    【解决方案6】:

    我有两个扩展函数:

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

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 1970-01-01
      • 2018-01-19
      • 2022-07-07
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多