【问题标题】:Check that string does not start with any letters from List<string>检查字符串是否不以 List<string> 中的任何字母开头
【发布时间】:2018-09-27 04:35:41
【问题描述】:

如果我输入了一个字符串,是否可以检查第一个字母是否以字符串列表中的输入开头:

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

还是我必须走正则表达式路线?

【问题讨论】:

  • var lower = new string(dir?.FirstOrDefault() ?? new char(), 1); if (list.Contains(lower) { 如果列表是char 的列表/哈希集,您可以简化这一点。

标签: c# .net string list startswith


【解决方案1】:

要考虑的一种方法:

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

第一行从字符串中获取第一个字符,并处理空字符串和null 字符串(通过获取空字符),然后将char 加载到string 中。

如果 List&lt;string&gt;List&lt;charHashSet&lt;char&gt;,您可以简化这一点。然后你可以删除new string 部分。

【讨论】:

    【解决方案2】:

    您可以检查第一个字母是否在列表中:

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

    【讨论】:

      【解决方案3】:

      如果使用HashSet&lt;&gt; 多次执行此检查,将比List&lt;&gt; 上的linear search 更高效。即使性能不是问题,HashSet&lt;&gt; 也可能更好地代表数据及其使用方式,因为每个元素都是唯一的,并且顺序无关紧要。

      这里我使用的是HashSet&lt;&gt;chars...

      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() 是用于不区分大小写比较的 recommended way to normalize case。然后,您可以像这样以不区分大小写的方式执行检查...

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

      或者,您可以使用strings 中的HashSet&lt;&gt; 并传入不区分大小写的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...
      }
      

      使用这种方法,将受限字符 strings 输入到 HashSet&lt;&gt; 的大小写无关紧要。

      【讨论】:

        【解决方案4】:

        我就是这样做的

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

        【讨论】:

        • 为什么不直接使用(MyList.IndexOf(dir.Substring(0, 1).ToLower()) != -1) ? "True" : "False" 而不是MyList.Contains(dir.Substring(0, 1).ToLower())
        • 对不起,我是 C# 新手。我从来没见过?就是这样用的。
        • 如果您指的是“?”在我的评论末尾,这不是代码的一部分,只是提出了一个问题。无论您调用IndexOf(...) != -1 还是Contains(...),都不需要?: 三元运算,因为前面的表达式已经计算为bool,它可以很容易地通过Console.WriteLine() 转换为"True""False" 文本。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 2021-12-03
        • 2011-12-07
        • 2023-01-01
        • 2010-10-30
        相关资源
        最近更新 更多