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 arrayand skiparray 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);