【问题标题】:find index of list with params c#使用参数c#查找列表索引
【发布时间】:2013-12-06 23:34:35
【问题描述】:

我基本上是在尝试转换:

private int FindIndexOf(string valueOne, string valueTwo, List<string> list)
{
    return list.FindIndex(s =>
        s.ToLower().Contains(valueOne.ToLower()) &&
        s.ToLower().Contains(valueTwo.ToLower())
        );
}

像这样使用参数:

private int FindIndexOf(List<string> list, params string[] args)
{
    string pattern = String.Format("([{0}]+)", String.Join("]+[", args));
    Regex regEx = new Regex(pattern, RegexOptions.IgnoreCase);
    return list.FindIndex(s => regEx.IsMatch(s.ToLower()));
}

我对 RegEx 不是很好,我想不出在 linq 中实现这一点的方法。有什么建议吗?

【问题讨论】:

    标签: c# .net regex linq


    【解决方案1】:

    您不需要正则表达式,也不需要ToLower

    private int FindIndexOf(List<string> list, params string[] args)
    {
        return list
           .FindIndex(s => args
               .All(str => s.IndexOf(str, StringComparison.OrdinalIgnoreCase) >= 0));
    }
    

    为什么ToLower 可能不正确:https://stackoverflow.com/a/234751/284240

    【讨论】:

    • 嗯,有道理。感谢您提供 ToLower 上的链接。我肯定会停止在我的代码中使用它!
    【解决方案2】:

    改为使用全部:

    var argsLower = args.Select(q=> q.ToLower());
    list.FindIndex(c => argsLower.All(x => c == x));
    

    【讨论】:

      【解决方案3】:

      一个基于正则表达式的解决方案,记录在案:

      private int FindIndexOf(List<string> list, params string[] args)
      {
          string pattern = args.Aggregate(new StringBuilder(), 
              (sb, a) => sb.Append("(?=.*").Append(Regex.Escape(a)).Append(")")
          ).ToString();
          Regex regEx = new Regex(pattern, RegexOptions.IgnoreCase);
          return list.FindIndex(s => regEx.IsMatch(s));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        相关资源
        最近更新 更多