字符串是否在数组中?


107

查看a string[]中是否包含元素的最佳方法是什么。这是我的第一枪。但是也许有些事情我忽略了。数组大小不得超过200个元素。

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}

Answers:


210

只需使用已经内置的Contains()方法即可:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

由于某种原因,当我第一次寻找该方法时,我找不到它...谢谢。
布拉德

4
@Brad:那是因为它是Enumerable的扩展方法。
AnthonyWJones

8
作为单线:(new string[] { "foo", "bar" }).Contains("foo")
Denis V

8
甚至更短:new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot

25

我知道这很古老,但是我希望新读者知道有一种使用泛型和扩展方法来执行此操作的新方法。

您可以阅读我的博客文章,以了解有关如何执行此操作的更多信息,但是主要思想是:

通过将此扩展方法添加到您的代码中:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

您可以像这样执行搜索:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

它适用于任何类型(只要您创建良好的equals方法)。当然,任何值类型。


我有这样的 var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");事情,我想要做的就是浏览第一列中的who数据表,以查看值是否不以以下任何字符串结尾..如果没有,那么我想返回一个字符串,指出.00例如,在使用您的示例时,它缺少一个值。我似乎无法使该示例正常工作,这有点棘手,因为我不想返回布尔值,但是我改变了您的方法以返回字符串,但仍然没有任何建议
MethodMan

这似乎是网站上的一个问题。继续并根据需要参考此答案。
加布里埃尔·麦克亚当斯2015年

我实际上想出了一种很棒的方法来做我想做的事情,我写了一些东西来检查Datatables ItemArray的for循环内的字符串值是否以我拥有的以下任何值结尾字符串 public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan

12

您只需要使用Array.Exists函数即可(如果使用的是.NET 3.5,则可以使用Contains扩展方法,这稍微方便些)。


3
下面是.NET 2.0工作示例:如果(Array.Exists(arrayToLookThrough,O => 0 == elementToSearchFor))

7

Linq(针对S&G):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

或者,根据要求

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));


2

通常,如果要询问特定对象是否在集合中,则数组使用的数据结构很差。

如果您将经常运行此搜索,那么使用a Dictionary<string, something>而不是数组可能是值得的。在字典中的查找为O(1)(恒定时间),而在数组中进行搜索的时间为O(N)(花费的时间与数组的长度成正比)。

即使数组最多只有200个项目,但是如果您进行了大量此类搜索,则字典可能会更快。


1
二分查找为O(log n); 字典对应于O(1)-但是开销很大;对于中小型企业,线性搜索或二进制搜索的性能可能会优于其他。
马克·格拉韦尔

1

您还可以使用LINQ遍历数组。或者,您可以使用Find方法,该方法需要委托进行搜索。但是我认为find方法要比循环遍历的方法贵一些。


Find方法在算法上与“循环遍历”方法相同。任何额外的开销都将是一些对象创建,或者可能是间接的一层或两层,但是,如果您担心以牺牲可读性为代价来优化这些对象,那么您将担心错误的事情。
AwesomeTown

1

正如上面线程中多次提到的,它取决于所使用的框架。.Net Framework 3及更高版本具有用于数组的.Contains()或Exists()方法。对于下面的其他框架,可以执行以下技巧,而不是遍历数组...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

不太确定效率... Dave


0

这比手动遍历数组更快:

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }

使用LINQ的速度比在示例中遍历字符串的速度快。strArray.Contains(key)才是真正必要的
克里斯·

3
在幕后,无论如何strArray.Contains(key)都将遍历整个数组...没有任何魔术可以使您摆脱O(n)搜索。
AwesomeTown

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.