如何在字符串数组中搜索字符串


77

我需要在字符串数组中搜索一个字符串。我不想使用任何循环

string [] arr = {"One","Two","Three"};

string theString = "One"

我需要检查arr中是否存在theString变量。

Answers:


76

前面提到的每种方法都会在内部或外部进行循环,因此,如何实现它并不是很重要。这是查找目标字符串的所有引用的另一个示例

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

10
我认为Array.Exists()更好。
David Thielen

这是使用搜索项过滤数组的适当答案
Rejwanul Reja

127

好吧,这将是必须要看的事情,并且循环比递归更有效(因为没有完全实现尾端递归)……因此,如果您只是不想循环自己,那么可以选择:

bool has = arr.Contains(var); // .NET 3.5

要么

bool has = Array.IndexOf(arr, var) >= 0;

有关信息:避免使用像var这样的名称-这是C#3.0中的关键字。


27

是否必须是字符串[]?List <String>将满足您的需求。

List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");



11

非常简单。我总是使用此代码从字符串数组中搜索字符串

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    return true;
}
else
{
    return false;
}

7

如果数组已排序,则可以使用BinarySearch。这是一个O(log n)操作,因此循环更快。如果您需要应用多个搜索并且速度是一个问题,则可以在使用它之前对它(或副本)进行排序。



4

为什么禁止“我不想使用任何循环”?那是最明显的解决方案。如果有机会变得明显,那就抓住它吧!

请注意,像这样的调用arr.Contains(...)仍会循环,只是您不会编写循环。

您是否考虑过更适合搜索的替代表示形式?

  • 一个好的Set实现将表现良好。(HashSet,TreeSet或本地等效项)。
  • 如果可以确定是否arr已排序,则可以使用二进制搜索(需要递归或循环,但不如线性搜索那么频繁)。

2

乍一看,我可能会想到这样的东西(但它是伪代码,并假定您不能使用任何.NET内置库)。可能需要进行一些调整和重新思考,但是对于初学者来说应该足够好了吗?

int findString(String var, String[] stringArray, int currentIndex, int stringMaxIndex)
    {
    if currentIndex > stringMaxIndex 
       return (-stringMaxIndex-1);
    else if var==arr[currentIndex] //or use any string comparison op or function
       return 0;
    else 
       return findString(var, stringArray, currentIndex++, stringMaxIndex) + 1 ;
    }



    //calling code
    int index = findString(var, arr, 0, getMaxIndex(arr));

    if index == -1 printOnScreen("Not found");
    else printOnScreen("Found on index: " + index);

2

在C#中,如果可以使用ArrayList,则可以使用Contains方法,该方法返回一个布尔值:

if MyArrayList.Contains("One")

4
在.NET 2.0中,始终首选List <T>而不是ArrayList。List <string>将执行相同的操作,但是具有更好的类型安全性和更大的灵活性。
马克·格拉韦尔

2

您可以使用Array类型的Find方法。从.NET 3.5及更高版本开始。

public static T Find<T>(
    T[] array,
    Predicate<T> match
)

这是一些例子:

// we search an array of strings for a name containing the letter “a”:
static void Main()
{
  string[] names = { "Rodney", "Jack", "Jill" };
  string match = Array.Find (names, ContainsA);
  Console.WriteLine (match);     // Jack
}
static bool ContainsA (string name) { return name.Contains ("a"); }

这是用匿名方法缩短的相同代码:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, delegate (string name)
  { return name.Contains ("a"); } ); // Jack

Lambda表达式将其进一步缩短:

string[] names = { "Rodney", "Jack", "Jill" };
string match = Array.Find (names, n => n.Contains ("a"));     // Jack

2

您可以通过以下方式检查元素的存在

arr.Any(x => x == "One")

0

这是旧的,但这是我做的方式,

enter code herevar结果= Array.Find(名称,元素=>元素==“一个”);


0

我很惊讶没有人建议使用Array.IndexOfMethod。

确实Array.IndexOf有两个优点:

  • 它允许搜索元素是否包含在数组中,
  • 它同时获得数组的索引。
int stringIndex = Array.IndexOf(arr, theString);
if (stringIndex >= 0)
{
    // theString has been found
}

内联版本:

if (Array.IndexOf(arr, theString) >= 0)
{
    // theString has been found
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.