如何检查一个字符串是否包含字符串数组中的任一元素?

3
我正在尝试实现一个简单的搜索功能。我有一个字符串数组,其中包含用户输入的所有单词以进行搜索。我还有另一个字符串,其中包含用户名称、内容等数据...所以我想做的是检查名称是否包含搜索或字符串数组中的任何元素。目前,我有一个循环,逐个检查单词,并将结果连接在 IEnumerable 中。
有没有人知道更快的搜索方法?像 String.ContainsAny(Search[]) 这样的方法?

s = "管理员在这里"; IEnumerable<Post> posts = from p in post_repository.Posts where p.Content.Contains(s) || p.Author.Contains(s) || p.ContactEmail.Contains(s) select p; - user1034489
上面的注释是代码的一部分,我不知道修改需要5分钟。 非常抱歉格式很糟糕。这是我正在进行的搜索,但问题是它在字符串s中搜索整个短语。但我想让它搜索每个单词。所以我将字符串s分成几部分。之后我得到了一个字符串数组。现在我必须找到一种有效的搜索方式,这就是我卡住的地方。 - user1034489
你没有回答你多久重新使用列表进行搜索。如果它被读取的次数比重新创建/更新的次数多,那么你可以先对其进行排序。 - Jon Adams
使用量可能非常高,因为帖子没有限制,搜索词的数量也可能很多。这就是为什么我真的想避免一个巨大的循环。我会开始阅读你给的链接,谢谢顺便说一句。我非常感激你们提供的所有帮助。 - user1034489
帖子永远不会被删除,理论上它将永远存在。 - user1034489
显示剩余6条评论
5个回答

8

试试这个:

Search.Any(p => name.Contains(p))

1
有人知道更快的搜索方法吗?这与问题中的算法不同吗?真的更快吗? - L.B
据我所知,默认的对象提供程序 Any() 方法会进行线性搜索,直到找到一个为止。因此,最坏情况是 O(N)。 - Jon Adams
我正在实现它,但有点困惑。代码中的“p”是什么意思?谢谢。 - user1034489
@user1034489:这是新的C# 3.0快捷语法。它基本上是一种新的方法参数,你可以在方法体中看到它被使用(name.Contains(p))——这就是整个方法体。想要了解更多信息,请阅读关于LINQ如何工作的内容。 - Jon Adams
@user1034489 http://www.switchonthecode.com/tutorials/csharp-tutorial-the-lambda-operator http://msdn.microsoft.com/en-us/library/bb397687.aspx 但请注意,代码越短并不意味着它运行得更快。 - L.B

2
using System.Linq;

string[] searchItems = ...
string input = "This is the input text";

// Check whether at least one match found
bool matchFound = input.Any(w => input.Contains(w));

// Count all matches
int matchesCount = input.Where(w => input.Contains(w))
                        .Count();

2
我有点困惑... searchItems 在你的代码中从未被使用过。 - Mr. Boy

1
string[] searchItems = ...;
string[] userNames = ...;

var matches = userNames.Intersect(searchItems);

关于intersect方法,您可以在这里找到更多信息这里


1

你可以这样做...

return array.Any(s => s.Equals(myString))

或者试试这样...

 string stringToCheck = "text1";
        string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
        foreach (string x in stringArray)
        {
            if (x.Contains(stringToCheck))
            {
                // Process...
            }

        }

或者类似这样

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
if (Array.Exists<string>(stringArray, (Predicate<string>)delegate(string s) { 
    return stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1; })) {
    Console.WriteLine("Found!");
}

你会如何修改第一个版本以允许不区分大小写的比较? - Mr. Boy

0

例如,这个问题有两种解决方案:

  1. 解决方案1

    private void findDateColumn()   {
            string stringToCheck = "date";
            int stringToCheckIndex = -1;
            string elementInArray = "未定义或未找到";
            if (Array.Exists<string> (headers, (Predicate<string>) delegate (string s)
            {
            stringToCheckIndex = s.IndexOf (stringToCheck,StringComparison.OrdinalIgnoreCase);
            elementInArray = s;
            return stringToCheckIndex > -1;
            }))
            {
            dateColTitle.Text = elementInArray; //一个文本框来显示输出
            }
    }
    
  2. 解决方案2

我正在使用@Lev的答案,它似乎更简单、更短,并且能够得到相同的结果:

    private void setDateColumnTitle ()
{

dateColTitle.Text = "Not Defined or Not Found";

var match = headers.FirstOrDefault(c => c.IndexOf("date", StringComparison.OrdinalIgnoreCase) > -1);

if (match!=null)                
    dateColTitle.Text = match;               
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接