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

次のオーバーロードでネストAnyして使用できます。StringComparisonIndexOf

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 に答える