This is simply an extension method which checks if a string str
contains all the values in values
.
However, there are cases when str
might be null, values
might be null, or any item in values
might be null. I am handling those cases by using the ternary ?:
, null-conditional ?.
and null-coalesce ??
operators.
Should this piece of code be refactored?
public static bool ContainsAll(this string str, string[] values)
{
return str == null ? false : values?.All(v => str.Contains(v ?? "")) ?? false;
}
1 Answer 1
I like the ternary operator but in this case I wouldn't use it because a single expression that makes sure both variables are valid and then searching for the strings is easier to understand I think.
The v ?? ""
isn't very pretty, especially the ""
part which actually should be string.Empty
. You could get rid of it by filtering the array and skipping the empty and null elements.
public static bool ContainsAll(this string str, params string[] values)
{
return
!string.IsNullOrEmpty(str) &&
values != null &&
values
.Where(x => !string.IsNullOrEmpty(x))
.All(v => str.Contains(v));
}
If you decorate the second parameter with params
keyword then you can just type the values without an array (if you need to):
"text".ContainsAll("t", null);
-
\$\begingroup\$ Personally I wouldn't go with string.Empty. But I'll leave it to whatever the preferences are for any one team. \$\endgroup\$Measurity– Measurity2017年01月30日 13:17:12 +00:00Commented Jan 30, 2017 at 13:17
string.Contains()
, hencev ?? ""
returns v, if non-null, otherwise "". \$\endgroup\$