检查字符串数组是不是包含值,如果是,则获取其位置
Posted
技术标签:
【中文标题】检查字符串数组是不是包含值,如果是,则获取其位置【英文标题】:Checking if a string array contains a value, and if so, getting its position检查字符串数组是否包含值,如果是,则获取其位置 【发布时间】:2011-12-13 14:53:51 【问题描述】:我有这个字符串数组:
string[] stringArray = "text1", "text2", "text3", "text4" ;
string value = "text3";
我想确定stringArray
是否包含value
。如果是这样,我想定位它在数组中的位置。
我不想使用循环。谁能建议我如何做到这一点?
【问题讨论】:
【参考方案1】:您可以使用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
【讨论】:
...而且我已经使用 foreach 几个月了。顺便说一句,这在计算上比 BLUEPIXY 的答案快吗?还是更慢?Array.IndexOf
关心大小写吗? "text1" == "TEXT1"
?
Array.IndexOf
仅当索引为 0 有界时才返回 −1
。这种情况会破裂,所以要注意! var a = Array.CreateInstance(typeof(int),new int[] 2 , new int[] 1 ); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
如果您正在寻找完全匹配,这很有用。但是,如果您不关心大小写,这可能会很有用:How to add a case-insensitive option to Array.IndexOf【参考方案2】:
var index = Array.FindIndex(stringArray, x => x == value)
【讨论】:
这应该是公认的答案,因为它允许传入一个 lambda 来执行更复杂的事情,例如 Array.FindIndex(array, x => x.StartsWith("insert string here")) 但这不是问题所要求的。问题询问如何从数组中找到已知值。 @KarlGjertsen 我想定位它在数组中的位置 不过这非常有用,能够执行 x.ToUpper() 之类的操作对我来说非常有益。【参考方案3】:我们也可以使用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"));
【讨论】:
简洁明了的回答 如何检查单个值?当我尝试检查 char 数组是否有 char 时,我收到一条消息,指出char
无法转换为 System.Predicate<char>
Array.Exists(array, element => element.Equals("perl", StringComparison.OrdinalIgnoreCase)
如果你关心大写。【参考方案4】:
编辑:我没有注意到你也需要这个职位。您不能直接在数组类型的值上使用IndexOf
,因为它是显式实现的。但是,您可以使用:
IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
...
(这类似于根据 Darin 的回答调用 Array.IndexOf
- 只是另一种方法。我不清楚为什么 IList<T>.IndexOf
在数组中显式实现,但没关系...... )
【讨论】:
如何使用 Contains 找到数组中世界的位置? 是否有可能检查字符串数组 A 中的字符串项是否存在于另一个字符串数组 B 中? @MuraliMurugesan:不清楚你在问什么——这两个数组是否有 any 项共同点?一个特定项? (在后一种情况下,它也在数组中这一事实是无关紧要的。) 我试图在这里回答 ***.com/a/22812525/1559213 。我开始为 html.CheckBox 行返回真/假。实际上有一个月份数组,也有几个月的模型。如果月份数组中存在模型月份,我们需要返回 true。感谢火箭回复:) @MuraliMurugesan:听起来像if (months.Contains(model.Month))
【参考方案5】:
您可以使用Array.IndexOf()
- 请注意,如果尚未找到该元素,它将返回 -1 并且您必须处理这种情况。
int index = Array.IndexOf(stringArray, value);
【讨论】:
【参考方案6】:你可以这样尝试...如果你也想知道位置,你可以使用 Array.IndexOf()
string [] arr = "One","Two","Three";
var target = "One";
var results = Array.FindAll(arr, s => s.Equals(target));
【讨论】:
【参考方案7】: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 方法会失败。
【讨论】:
您的答案与 Priyank 的答案基本相同。它没有给出 OP 所要求的元素的索引。 @reggaeguitar 同意你的观点! 这是我一直在寻找的解决方案,尽管它并没有完全回答问题。【参考方案8】:使用 System.Linq
stringArray.Contains(value3);
【讨论】:
【参考方案9】:你可以试试这个,它查找包含该元素的索引,并将索引号设置为 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");
【讨论】:
【参考方案10】: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);
【讨论】:
【参考方案11】:我创建了一个可重复使用的扩展方法。
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
【讨论】:
OP 要求的position
在哪里?【参考方案12】:
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' 的定义。【参考方案13】:最简单和更短的方法如下。
string[] stringArray = "text1", "text2", "text3", "text4" ;
string value = "text3";
if(stringArray.Contains(value))
// Do something if the value is available in Array.
【讨论】:
问题是关于在数组中查找项目的位置......使用Contains
方法,您没有此信息以上是关于检查字符串数组是不是包含值,如果是,则获取其位置的主要内容,如果未能解决你的问题,请参考以下文章
检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)