var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains)) return true;
0
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };
if (strNamesArray.Any(x => x == strName))
{
// do some action here if true...
}
String[] val = { "helloword1", "orange", "grape", "pear" };
Expression<Func<Item, bool>> someFieldFilter = i => true;
someFieldFilter = i => val.Any(s => i.someField.Contains(s));
0
public bool ContainAnyOf(string word, string[] array)
{
for (int i = 0; i < array.Length; i++)
{
if (word.Contains(array[i]))
{
return true;
}
}
return false;
}
public static class Extensions
{
public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
Trie trie = new Trie(stringArray);
for (int i = 0; i < stringToCheck.Length; ++i)
{
if (trie.MatchesPrefix(stringToCheck.Substring(i)))
{
return true;
}
}
return false;
}
}
这是 Trie 类的实现
public class Trie
{
public Trie(IEnumerable<string> words)
{
Root = new Node { Letter = '\0' };
foreach (string word in words)
{
this.Insert(word);
}
}
public bool MatchesPrefix(string sentence)
{
if (sentence == null)
{
return false;
}
Node current = Root;
foreach (char letter in sentence)
{
if (current.Links.ContainsKey(letter))
{
current = current.Links[letter];
if (current.IsWord)
{
return true;
}
}
else
{
return false;
}
}
return false;
}
private void Insert(string word)
{
if (word == null)
{
throw new ArgumentNullException();
}
Node current = Root;
foreach (char letter in word)
{
if (current.Links.ContainsKey(letter))
{
current = current.Links[letter];
}
else
{
Node newNode = new Node { Letter = letter };
current.Links.Add(letter, newNode);
current = newNode;
}
}
current.IsWord = true;
}
private class Node
{
public char Letter;
public SortedList<char, Node> Links = new SortedList<char, Node>();
public bool IsWord;
}
private Node Root;
}
26 回答
展示了三种选择 . 我更愿意发现第三个是最简洁的 .
这是你如何做到的:
UPDATE: 您可能正在寻找更好的解决方案..请参阅下面的@Anton Gogolev的答案,其中使用了LINQ .
这是如何做:
这将检查
stringToCheck
是否包含stringArray
中的任何一个子字符串 . 如果要确保它包含所有子字符串,请将Any
更改为All
:试试这个:
无需使用LINQ
只需使用linq方法:
(抱歉无法在现有答案上添加评论,因为我的声誉<50)
最简单和样本方式 .
也许这样的东西:
使用Linq和方法组将是最快速,更紧凑的方法 .
尝试:
你也可以像Anton Gogolev建议的那样做,检查
stringArray1
中的 any item 是否与stringArray2
中的 any item 匹配:同样,stringArray1中的 all items 与stringArray2中的 all items 匹配:
我在控制台应用程序中使用以下内容来检查参数
我会使用Linq但它仍然可以通过以下方式完成:
您可以定义自己的
string.ContainsAny()
和string.ContainsAll()
方法 . 作为奖励,我甚至抛出了一个允许不区分大小写的比较等的string.Contains()
方法 .您可以使用以下代码测试这些:
试试这个,这里的示例:检查字段是否包含数组中的任何单词 . 检查字段(someField)是否包含数组中的任何单词 .
我使用了与Maitrey684的IndexOf类似的方法和Theomax的foreach循环来创建它 . (注意:前3个“字符串”行只是一个如何创建数组并使其成为正确格式的示例) .
如果要比较2个数组,它们将以分号分隔,但最后一个值后面没有一个数组 . 如果在数组的字符串形式中附加一个分号(即a; b; c变为a; b; c;),则可以使用“x;”匹配无论它处于什么位置:
如果搜索的字符串与数组'lines'的任何元素匹配,则bFound设置为true .
试试这个
它将返回您正在查找的文本的第一个出处的行 .
如果
stringArray
包含大量不同长度的字符串,请考虑使用Trie来存储和搜索字符串数组 .这是
Trie
类的实现如果
stringArray
中的所有字符串具有相同的长度,那么最好只使用HashSet
而不是Trie
简单的解决方案,不需要linq任何
String.Join(“,”,array).Contains(Value“,”);
试试这个,不需要循环..
要完成上述答案,请 IgnoreCase 检查使用:
就我而言,上述答案无效 . 我正在检查数组中的字符串并将其分配给布尔值 . 我修改了@Anton Gogolev的答案并删除了
Any()
方法并将stringToCheck
放在Contains()
方法中 .我使用以下代码检查字符串是否包含字符串数组中的任何项: