C# 字符串在数组中吗?

C# 字符串在数组中吗?,c#,arrays,string,C#,Arrays,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; } bo

查看
字符串[]
以查看它是否包含元素的最佳方法是什么。这是我第一次尝试。但也许我忽略了一些东西。数组大小将不大于200个元素

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

对于(int i=0;i只需使用已内置的Contains()方法:


您也可以使用LINQ对数组进行迭代。或者您可以使用Find方法,该方法需要委托来搜索它。但是,我认为Find方法比循环搜索要贵一些。

数组排序了吗?如果是这样,您可以进行一次排序。如果数组排序了,那么二进制搜索将比其他方法提高性能操作解决方案。

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

Linq(对于s&g):

或者,取决于要求

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

这比手动遍历数组更快:

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

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

通常,如果要询问某个特定对象是否在集合中,数组是一种糟糕的数据结构

如果您经常运行此搜索,那么使用
字典而不是数组可能是值得的。字典中的查找是O(1)(恒定时间),而在数组中的搜索是O(N)(所需时间与数组长度成比例)


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

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

((IList<string>)"Your String Array Here").Contains("Your Search String Here")
((IList)“此处的字符串数组”)。包含(“此处的搜索字符串”)
对效率不太确定。。。
Dave

我知道这很旧,但我想让新读者知道,有一种新方法可以使用泛型和扩展方法来实现这一点

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

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

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

它适用于任何类型(只要您创建了一个好的equals方法)。任何值类型都可以确定。

如果您不想或根本不能使用Linq,您也可以使用静态
数组。存在(…);
函数:


当谓词返回true时,catInside也将为true。

由于某种原因,当我第一次查找该方法时,我找不到它…谢谢。@Brad:那是因为它是来自Enumerable的扩展方法。作为一个一行:
(新字符串[]{“foo”,“bar”)。包含(“foo”)
甚至更短:
新[]{“foo”,“bar”}.Contains(foo)
查找方法在算法上与“循环通过”相同方法。任何额外的开销都将是一些对象创建,可能是一层或两层间接寻址,但是,如果您担心以牺牲可读性为代价优化这些对象,那么您担心的是错误的事情。使用LINQ比在示例中迭代字符串要快。strArray.Contains(key)strArray,所有这些在幕后都是必需的。Contains(key)只是在数组中循环…没有什么神奇的东西可以让你不去做O(n)搜索。二进制搜索是O(logn);字典子段是O(1)-但是有很多开销;对于小型到中型,线性搜索或二进制搜索的性能可能会超过。下面是.NET 2.0的一个工作示例:如果(Array.Exists(arrayToLookThrough,o=>o==elementToSearchFor)),我有这样的
var xxx=csvData.Rows[0].ItemArray[0].IsIn(“.00”、“0.0”、“0.0”、“0.0”、“0.0”、“0.5”、“0.50”、“0.75”);
我想做的是查看第一列中的who数据表,看看这些值是否以以下任何字符串结尾。如果它们没有结尾,那么我想返回一个字符串,说明它缺少一个值
.00
,例如,使用您的示例,我似乎无法使这个值起作用,因为我不想t为了返回bool我改变了你的方法来返回字符串,但仍然不起任何作用。这似乎最好在网站上作为一个问题提出。如果需要,继续并参考这个答案。我实际上能够想出一个很棒的方法来做我想做的事情。我写了一些东西,可以检查循环Datatables ItemArray,以我在字符串
public static bool EndWithValue(此字符串值,IEnumerable values){返回值.any(item=>value.EndsWith(item));}
((IList<string>)"Your String Array Here").Contains("Your Search String Here")
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");
var arr = new string[]{"bird","foo","cat","dog"};

var catInside = Array.Exists( 
  arr, // your Array
  (s)=>{ return s == "cat"; } // the Predicate
);