C# 测试项目数组是否在预定义数组中的最佳方法是什么

C# 测试项目数组是否在预定义数组中的最佳方法是什么,c#,arrays,ienumerable,C#,Arrays,Ienumerable,通过给出一个字符串数组,我想测试数组中的每个元素是否包含在预定义的字符串数组中 例如: var a = new[] { "test1", "test2" }; var b = new[] { "test1", "test4" }; var c = new[] { "test1", "test3", "test1", "test3" }; var predefined = new[] { "test1", "test2", "test3" }; 变量a和c将返回true,b将返回false

通过给出一个字符串数组,我想测试数组中的每个元素是否包含在预定义的字符串数组中

例如:

var a = new[] { "test1", "test2" };

var b = new[] { "test1", "test4" };

var c = new[] { "test1", "test3", "test1", "test3" };

var predefined = new[] { "test1", "test2", "test3" };
变量a和c将返回true,b将返回false


什么是最有效的C代码方式?

不确定最有效但最易于阅读和标准的代码是否是

arrayToCheck.All(a => predefined.Contains(a))

不确定最有效但最容易阅读的标准代码是否是

arrayToCheck.All(a => predefined.Contains(a))

订购对你来说重要吗?如果不是,我就使用LINQ:

if (!a.Except(predefined).Any())
{
    // predefined contains every element of a
    // (Way to read this: there is no element of a which isn't also in predefined)
}
通常是O(N+M),而不是
All
包含的
解决方案是O(N*M)。当然,这并不是绝对性能。如果您使用的是小型集合,
All
包含的
实际上可能更快。随着涉及的集合越来越大,这可能会更快

编辑:如注释中所述,如果您可以从
预定义的
创建一个
哈希集
,并重用它,那么它会更高效。。。而且实际上也更具可读性:

var predefinedSet = new HashSet<string>(predefined);
...

if (predefinedSet.IsSupersetOf(a))
{
    ...
}
var predefinedSet=新哈希集(预定义);
...
if(预定义的集合。发布时间(a))
{
...
}

订购对您来说重要吗?如果不是,我就使用LINQ:

if (!a.Except(predefined).Any())
{
    // predefined contains every element of a
    // (Way to read this: there is no element of a which isn't also in predefined)
}
通常是O(N+M),而不是
All
包含的
解决方案是O(N*M)。当然,这并不是绝对性能。如果您使用的是小型集合,
All
包含的
实际上可能更快。随着涉及的集合越来越大,这可能会更快

编辑:如注释中所述,如果您可以从
预定义的
创建一个
哈希集
,并重用它,那么它会更高效。。。而且实际上也更具可读性:

var predefinedSet = new HashSet<string>(predefined);
...

if (predefinedSet.IsSupersetOf(a))
{
    ...
}
var predefinedSet=新哈希集(预定义);
...
if(预定义的集合。发布时间(a))
{
...
}

您希望测试的集合有多大?如果有可能将
predifend
的类型更改为
var预定义=新哈希集{“test1”、“test2”、“test3”,},则您可能会获得更好的性能。您可以使用
HashSet
上的
IsSupersetOf
方法。您希望测试的集合有多大?是否可以将
predifend
的类型更改为
var预定义=新的HashSet{“test1”、“test2”、“test3”,},则您可能会获得更好的性能。在
HashSet
上有一个
issuepersetof
方法,您可以使用它。+1为两个建议的解决方案注释大O性能符号如果您预定义了一个HashSet,不是
All
<代码>包含
成为O(N)?它不应该是
a。除了(预定义的)
?@MattW:是的,你可以这样做。老实说,很难从这个问题中看出多少。@AnthonyPegram:实际上,使用
HashSet
它会变得更好。。。使用
IsSupersetOf
+1记录两个建议解决方案的大O性能符号如果您预定义了一个哈希集,不是
All
<代码>包含
成为O(N)?它不应该是
a。除了(预定义的)
?@MattW:是的,你可以这样做。老实说,很难从这个问题中看出多少。@AnthonyPegram:实际上,使用
HashSet
它会变得更好。。。使用
IsSupersetOf