6

我有一个字符串数组

string[] tmp = foo();

如果 foo 中没有任何字符串包含“bar”或“baz”,我想执行一些代码。这是查询此对象的正确方法吗?

if(!tmp.Any(p => p.ToLower().Contains("bar") || p.ToLower().Contains("baz"))
 doSomething(); 

|| 看起来很傻。我应该在这里使用正则表达式还是有更好的方法来做到这一点?***还要注意 tmp 中的值"bar=someValue"就像一个查询字符串。这段代码工作正常,但我确信它可以写得更好。感谢您提供任何反馈提示。

4

3 回答 3

4

好点?我不知道,但应该工作。

if(!tmp.Select(x => x.Split('=')[0])
                    .Intersect(new[] { "foo", "baz" }, 
                               StringComparer.InvariantCultureIgnoreCase).Any())
    doSomething();
于 2012-11-14T15:44:28.153 回答
1

您可以使用嵌套AnyStringComparison重载IndexOf

string[] source = { "hi=there", "hello=world", "foo=bar" };
string[] exclude = { "baz", "bar" };

if (!source.Any(src => 
        exclude.Any(exl =>  
            src.IndexOf(exl, StringComparison.InvariantCultureIgnoreCase) >= 0))) 
    doSomething();

或者打包为扩展方法:

public static class StringExtensions {
    public static bool ContainsAny(
        this IEnumerable<string> source,
        IEnumerable<string> target,
        StringComparison comparisonType = StringComparison.InvariantCultureIgnoreCase) {
        return source.Any(xsource => target.Any(
                xtarget => xsource.IndexOf(xtarget, comparisonType) >= 0));
    }
}


// Later ...
if (!source.ContainsAny(exclude))
    doSomething();
于 2012-11-14T16:16:49.597 回答
1

我认为您现有的代码没有任何问题;虽然可以稍微修改以避免额外的ToLower()调用:

var exists = tmp.Any(p => 
{ 
    var s = p.ToLower(); 
    return s.Contains("bar") || s.Contains("baz");
});
if(!exists) doSomething(); 

如果您的搜索词可能很多,那么这样的方法可能会更好:

var terms = new string[] {"bar", "baz", "foo", "boo", ...};
var exists = tmp.Any(p => terms.Any(t => p.ToLower().Contains(t)));
if(!exists) doSomething();
于 2012-11-14T16:26:09.607 回答