简体   繁体   English

用params c#查找列表索引

[英]find index of list with params c#

I'm basically trying to convert this: 我基本上试图转换这个:

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

to make use of params like this: 使用这样的参数:

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

I'm not very good with RegEx and I can't think of a way to implement this in linq. 我对RegEx不太满意,我想不出在linq中实现这个的方法。 Any suggestions? 有什么建议?

You don't need regex and you don't need ToLower : 你不需要正则表达式,你不需要ToLower

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

Why ToLower can be incorrect: https://stackoverflow.com/a/234751/284240 为什么ToLower可能不正确: httpsToLower

Use All instead: 改用全部:

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

A regex-based solution, for the record: 基于正则表达式的解决方案,用于记录:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM