簡體   English   中英

Linq在C#中查詢字符串數組是否包含兩個值之一?

[英]Linq query a string array in c# if contains either of two values?

我有一個字符串數組

string[] tmp = foo();

如果foo中的所有字符串都不包含“ bar”或“ baz”,我想執行一些代碼。 這是查詢此對象的正確方法嗎?

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

|| 看起來很傻。 我應該在這里使用正則表達式,還是有更好的方法呢? ***還請注意,tmp中的值類似於"bar=someValue"如查詢字符串。 這段代碼可以正常工作,但是我敢肯定它可以寫得更好。 感謝您提供任何反饋提示。

好點? 我不知道,但應該可以。

if(!tmp.Select(x => x.Split('=')[0])
                    .Intersect(new[] { "foo", "baz" }, 
                               StringComparer.InvariantCultureIgnoreCase).Any())
    doSomething();

您可以使用嵌套的AnyIndexOf StringComparison重載:

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();

我認為您現有的代碼沒有任何問題; 盡管可以稍加修改以避免額外的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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM