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

时间:2008-11-05 12:12:20

标签: c# asp.net

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

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

string theString = "One"

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

15 个答案:

答案 0 :(得分:112)

好吧,有些东西必须要看,循环比递归更有效(因为尾端递归没有完全实现)...所以如果你只是不想自己循环,那么:

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

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

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

答案 1 :(得分:61)

前面提到的每个方法都在内部或外部循环,因此如何实现它并不重要。这是查找目标字符串

的所有引用的另一个示例
       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

答案 2 :(得分:24)

是否必须是字符串[]?列表< String>会给你你需要的东西。

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

答案 3 :(得分:11)

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

答案 4 :(得分:9)

我认为最好使用 Array.Exists 而不是 Array.FindAll

答案 5 :(得分:8)

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

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

答案 6 :(得分:6)

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

答案 7 :(得分:4)

每个实现IList的类都有一个方法Contains(Object value)。 System.Array也是如此。

答案 8 :(得分:4)

为什么禁止“我不想使用任何循环”?这是最明显的解决方案。如果有机会显而易见,就拿吧!

请注意,arr.Contains(...)之类的调用仍然会进行循环,只是不是你编写循环的人。

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

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

答案 9 :(得分: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);

答案 10 :(得分:2)

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

if MyArrayList.Contains("One")

答案 11 :(得分:2)

您可以使用数组类型的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

答案 12 :(得分:1)

您可以通过

检查元素是否存在
arr.Any(x => x == "One")

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

我很惊讶没有人建议使用Array.IndexOf方法。

实际上,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
}