如何检查字符串数组中是否包含特定的字符串?

3

我正在使用.NET 2.0 我有一个大的字符串数组。 我想检查特定的字符串是否在数组中, 我不确定以下代码是否经过优化或者我需要进一步优化它。 请指导。

string []test_arr= new string[]{"key1","key2","key3"};
Boolean testCondition = (new List<string>(test_arr)).Contains("key3");

我也想了解更多关于

  1. .NET泛型
  2. .NET属性
  3. .NET反射

是否有好的参考书籍或资料可以推荐呢?

7个回答

9
string []test_arr= new string[]{"key1","key2","key3"};
bool testCondition = Array.Exists
(
    test_arr,
    delegate(string s) { return s == "key3";}
);

1
谢谢Luke,我是凭记忆写的。我已经纠正了代码。 - Matt Howells
你可能混淆了Lambda和委托符号 ;)。 - Dykam

2

我的回答与Matt Howells非常相似。但我建议使用StringComparison


Array.Exists<string>(stringsArray,
                delegate(string match)
                {
                    return match.Equals("key", StringComparison.InvariantCultureIgnoreCase)
                });

2

如果可能的话,您可以使用静态Array.Sort方法对数组进行排序,然后使用Array.BinarySearch

或者,您需要使用更优化的数据结构来存储您的字符串。


1
在.NET Framework 2.0版本中,Array类实现了System.Collections.Generic.IList、System.Collections.Generic.ICollection和System.Collections.Generic.IEnumerable泛型接口。
因此,您可以执行以下操作:
string[] test_arr = new string[]{"key1","key2","key3"};
Boolean testCondition = ((IList<string>)test_arr).Contains("key3");

1
在您的示例中,最大的开销可能是创建列表,但这可能是演示的一部分。
从数组开始,以下内容可能会更快:
int x = Array.IndexOf<string>(test_arr, "key3");
bool testCondition = x >= 0;

但如果您有选择的话,使用HashSet<string>在第一时间存储它们会更有效率。 HashSet可以在O(1)中检查元素的存在。

关于您的其他问题,它们已经在SO上被问过了,请使用搜索选项,例如使用"C#书籍"。


1

列表的时间复杂度为O(n),排序列表的时间复杂度为O(log n)


1
关于你的大型字符串数组: 只要使用数组,就没有优化的方法(必须从第一个元素开始并逐个查找,直到找到它-或者如果您不这样做,则遍历整个数组)-这会给您最坏情况下的时间复杂度为O(n)(O符号给出程序完成某些任务所需的时间)。
由于您想要优化搜索,我建议您改用哈希表或树(取决于数据集的大小)。这将大大减少您需要检查的时间。

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