我有一个字符串数组
string[] tmp = foo();
如果foo中没有字符串包含“bar”或“baz”,我想执行一些代码。 这是查询此对象的正确方法吗?
if(!tmp.Any(p => p.ToLower().Contains("bar") || p.ToLower().Contains("baz"))
doSomething();
||看起来很傻。我应该在这里使用正则表达式还是有更好的方法来做这个? ***另请注意,tmp中的值与查询字符串类似"bar=someValue"
。这段代码工作正常,但我确信它可以写得更好。感谢您提供反馈意见。
答案 0 :(得分:4)
还好吗?我不知道,但应该工作。
if(!tmp.Select(x => x.Split('=')[0])
.Intersect(new[] { "foo", "baz" },
StringComparer.InvariantCultureIgnoreCase).Any())
doSomething();
答案 1 :(得分:1)
您可以使用嵌套Any
StringComparison
重载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();
答案 2 :(得分:0)
我认为您现有的代码没有任何问题;虽然可以稍微修改,以避免额外的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();