检查字符串数组是否包含某个值,并获取该值的位置。

196

我有一个字符串数组:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

我想确定 stringArray 中是否包含 value。如果是的话,我想找出它在数组中的位置。

我不想使用循环。有谁能建议我如何做到这一点?

13个回答

374
你可以使用 Array.IndexOf 方法:
string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}

1
我已经使用foreach几个月了。顺便问一下,这是比BLUEPIXY的答案更快还是更慢的计算方法? - Max von Hippel
2
Array.IndexOf 是否区分大小写?"text1" == "TEXT1" 是否相等? - E.V.I.L.
1
Array.IndexOf returns −1 only if the index is 0-bounded. This case would break, so be aware! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0 - benscabbia
如果你想要一个完全匹配的结果,这个操作就很有用了。但是如果你不关心大小写,这个也许更有用:如何给 Array.IndexOf 函数添加一个不区分大小写的选项 - Kyle

83
var index = Array.FindIndex(stringArray, x => x == value)

7
这应该是被接受的答案,因为它允许我们传入一个lambda表达式来完成更复杂的任务,比如在数组中查找符合特定条件(以某个字符串开头)的元素的索引。 - reggaeguitar
3
问题并不是在问那个。问题是要求从数组中找到已知的值,你该如何做。 - Karl Gjertsen
2
@KarlGjertsen 我想要定位它在数组中的位置。 - BLUEPIXY
这非常有用,像 x.ToUpper() 这样的操作对我来说非常有益。 - mrshickadance

47

我们还可以使用 Exists

string[] array = { "cat", "dog", "perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

2
简洁明了的答案 - Aryan Firouzian
我该如何检查单个值?当我尝试检查字符数组中的一个字符时,我收到了一条消息,提示“char”无法转换为“System.Predicate<char>”。 - Aaron Franke
1
如果你关心大小写,可以使用以下代码:Array.Exists(array, element => element.Equals("perl", StringComparison.OrdinalIgnoreCase) - Topher Birth

15

编辑:我没注意到你也需要位置。由于它是显式实现的,所以您不能直接在数组类型的值上使用 IndexOf。但是,您可以使用以下方法:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(这类似于按照Darin的答案调用Array.IndexOf - 只是另一种方法。我不清楚为什么在数组中明确实现了IList<T>.IndexOf,但无论如何...)


如何使用Contains方法在数组中查找单词的位置? - MoShe
有没有可能检查字符串数组A中的字符串项是否存在于另一个字符串数组B中? - Murali Murugesan
@MuraliMurugesan:不太清楚你的问题 - 两个数组是否有任何共同项?还是只有特定项?(在后一种情况下,它也在一个数组中的事实是无关紧要的。) - Jon Skeet
我正在尝试回答这里的问题http://stackoverflow.com/a/22812525/1559213。我卡在了为Html.CheckBox行返回true/false上。实际上有一个月份数组和一个包含一些月份的模型。如果模型月份存在于月份数组中,我们需要返回true。感谢您的快速响应 :) - Murali Murugesan
@MuraliMurugesan:听起来像是 if (months.Contains(model.Month)) - Jon Skeet
非常感谢。根据您的输入,我使用了 model.contains(months[x]) - Murali Murugesan

6

您可以使用 Array.IndexOf() - 注意如果元素未找到,它将返回-1,您需要处理此情况。

int index = Array.IndexOf(stringArray, value);

4
你可以尝试像这样...你可以使用Array.IndexOf(),如果你想知道位置
       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

4

使用 System.Linq

stringArray.Contains(value3);

回答需要支持信息 您的回答可以通过提供更多的支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认您的回答是否正确。您可以在帮助中心找到关于如何撰写良好回答的更多信息。 - moken

4

检查数组中是否包含给定值的最佳方法是使用System.Collections.Generic.IList<T>.Contains(T item)方法,如下所示:

((IList<string>)stringArray).Contains(value)

完整代码示例:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[] 数组私有实现了 List<T> 的一些方法,例如 Count 和 Contains。因为它是显式(私有)实现,所以在使用这些方法之前需要先将数组强制转换。这不仅适用于字符串 - 只要元素的类实现了 IComparable,你就可以使用此技巧来检查任何类型的数组是否包含任何元素。

请注意,并非所有的 IList<T> 方法都是这样工作的。试图在数组上使用 IList<T> 的 Add 方法将会失败。


2
你的答案基本上与Priyank的相同。它没有给出元素的索引,这是OP所要求的。 - reggaeguitar
@reggaeguitar 我同意你的看法! - Si8
1
这正是我在寻找的解决方案,尽管它并没有完全回答问题。 - Auspex

1
你可以尝试这个方法,它会查找包含该元素的索引,并将索引号设置为整数,然后检查该整数是否大于-1,如果是0或更大,则表示找到了这样的索引 - 因为数组是基于0的。
string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }

0
string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',\t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接