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)操作,因此它比循环更快。如果您需要应用多个搜索,并且速度是一个问题,您可以在使用它之前对它(或副本)进行排序。
为什么禁止"我不想使用任何循环"?这是最明显的解决方案。当有机会变得明显的时候,抓住它!
注意,像
你是否考虑过一种更易于搜索的替代表示法?
- 一个好的集合实现会很好地执行。(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") |