用params c#查找列表索引

时间:2013-12-06 23:34:35

标签: c# .net regex linq

我基本上是想转换它:

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中实现这个的方法。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您不需要正则表达式,也不需要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

答案 1 :(得分:1)

改为使用全部:

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

答案 2 :(得分:0)

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

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