检查字符串数组是否包含值,如果是,则获取其位置


162

我有这个字符串数组:

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

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

我不想使用循环。谁能建议我该怎么做?

Answers:


316

您可以使用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的答案要快吗?或更慢?
马克斯·冯·希佩尔

2
是否Array.IndexOf关心大写?有"text1" == "TEXT1"吗?
EVIL'17年

Array.IndexOf返回−1仅当索引为0,有界的。这种情况会中断,所以要注意!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 Champion

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

7
这应该是可以接受的答案,因为它允许一个lambda传递来做更复杂的事情,例如Array.FindIndex(array,x => x.StartsWith(“ insert string here”))
reggaeguitar 2014年

1
但这不是问题所要的。问题问您如何从数组中找到已知值。
Karl Gjertsen 2014年

2
@KarlGjertsen 我想在数组中找到它的位置
BLUEPIXY 2014年

但是,这非常有用,能够执行x.ToUpper()之类的功能对我来说非常有益。
mrshickadance 2015年

31

我们也可以使用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"));

1
干净而简单的答案
Aryan Firouzian

如何检查单个值?当我尝试检查char数组中的char时,收到了char无法转换为的消息System.Predicate<char>
Aaron Franke

13

编辑:我没有注意到您也需要这个职位。您不能IndexOf直接在数组类型的值上使用,因为它是显式实现的。但是,您可以使用:

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

(这类似于调用Array.IndexOf按照达林的答案-只是一种替代方法,为什么这不是很清楚,我在阵列中明确实现,但没关系...)IList<T>.IndexOf


如何使用Contains在数组中找到世界的位置?
MoShe 2011年

是否可以检查字符串数组A中的字符串项是否存在于另一个字符串数组B中?
Murali Murugesan 2014年

@MuraliMurugesan:不清楚您要问什么-两个数组是否有任何共同点?一个特定的项目?(在后一种情况下,它也位于数组中是无关紧要的。)
Jon Skeet 2014年

我试图在这里回答stackoverflow.com/a/22812525/1559213。我很想为Html.CheckBox行返回true / false。实际上有一个数月的数组,也有数月的模型。如果在月份数组中存在模型月份,则需要返回true。感谢火箭的回应:)
Murali Murugesan 2014年

@MuraliMurugesan:听起来像if (months.Contains(model.Month))
Jon Skeet

5

您可以使用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));

3

IMO检查数组是否包含给定值的最佳方法是使用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 2014年

@reggaeguitar在那里与您同意!
SI 8

这是一直在寻找的解决方案,即使它不能完全回答问题。
Auspex

1

您可以尝试一下,它查找包含该元素的索引,并将索引号设置为int,然后检查int是否大于-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); }

}

0

我创建了一种扩展方法以供重复使用。

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

怎么称呼:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}

哪里position的OP是要求?
SI 8

-3
string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}

它给出错误:'System.Array'不包含'contains'的定义。
ePandit 2015年

-4

最简单,更短的方法如下。

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

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

3
问题是关于在数组中查找项目的位置。...使用该Contains方法,您将没有此信息
Bidou
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.