我需要搜索字符串数组中的字符串。我不想在其中使用任何循环
string [] arr = {"One","Two","Three"};
string theString = "One"
我需要检查arr。中是否存在theString变量。
答案 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(...)
之类的调用仍然会进行循环,只是不是你编写循环的人。
您是否考虑过更适合搜索的替代表示?
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
}