关于c#:如何在String数组中搜索字符串

How to search a string in String array

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

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

string theString ="One"

我需要检查arr中是否存在字符串变量。


嗯,必须要看一些东西,而且循环比递归更有效(因为尾部递归没有完全实现)。因此,如果您不想循环自己,那么:

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

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

信息:避免使用像var这样的名字-这是c 3.0中的一个关键字。


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

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


是否必须是字符串[]?列表将提供您需要的内容。

1
2
3
4
5
6
List<String> testing = new List<String>();
testing.Add("One");
testing.Add("Two");
testing.Add("Three");
testing.Add("Mouse");
bool inList = testing.Contains("Mouse");

1
bool exists = arr.Contains("One");

我认为使用array.exists比array.findall更好。


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

1
2
3
4
5
6
7
8
9
10
11
string[] stringArray = {"text1","text2","text3","text4" };
string value ="text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    return true;
}
else
{
    return false;
}


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


为什么禁止"我不想使用任何循环"?这是最明显的解决方案。当有机会变得明显的时候,抓住它!

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

你是否考虑过一种更易于搜索的替代表示法?

  • 一个好的集合实现会很好地执行。(hashset、treeset或本地等效项)。
  • 如果可以确定arr已排序,则可以使用二进制搜索(需要递归或循环,但不能像直线搜索那样频繁)。

实现IList的每个类都有一个方法contains(对象值)。System.Array也是如此。


可以使用数组类型的find方法。来自.NET 3.5及更高版本。

1
2
3
4
public static T Find<T>(
    T[] array,
    Predicate<T> match
)

以下是一些例子:

1
2
3
4
5
6
7
8
// 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"); }

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

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

lambda表达式进一步缩短了它:

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

在C中,如果可以使用arraylist,则可以使用contains方法,该方法返回布尔值:

1
if MyArrayList.Contains("One")


乍一看,我可以想出类似的方法(但它是伪代码,假设您不能使用任何.NET内置libaries)。可能需要一些调整和重新思考,但应该是一个良好的开端,也许?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);

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

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