我需要在字符串数组中搜索一个字符串。我不想使用任何循环
string [] arr = {"One","Two","Three"};
string theString = "One"
我需要检查arr中是否存在theString变量。
我需要在字符串数组中搜索一个字符串。我不想使用任何循环
string [] arr = {"One","Two","Three"};
string theString = "One"
我需要检查arr中是否存在theString变量。
Answers:
前面提到的每种方法都会在内部或外部进行循环,因此,如何实现它并不是很重要。这是查找目标字符串的所有引用的另一个示例
string [] arr = {"One","Two","Three"};
var target = "One";
var results = Array.FindAll(arr, s => s.Equals(target));
好吧,这将是必须要看的事情,并且循环比递归更有效(因为没有完全实现尾端递归)……因此,如果您只是不想循环自己,那么可以选择:
bool has = arr.Contains(var); // .NET 3.5
要么
bool has = Array.IndexOf(arr, var) >= 0;
有关信息:避免使用像var这样的名称-这是C#3.0中的关键字。
如果数组已排序,则可以使用BinarySearch。这是一个O(log n)操作,因此循环更快。如果您需要应用多个搜索并且速度是一个问题,则可以在使用它之前对它(或副本)进行排序。
每个实现IList的类都有一个方法Contains(Object value)。System.Array也是如此。
乍一看,我可能会想到这样的东西(但它是伪代码,并假定您不能使用任何.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);
您可以使用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
我很惊讶没有人建议使用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
}