将一个值与整个数组进行比较?(C#)

14

假设我有一个C#变量和数组:

int variable_1 = 1;
int[3] array_1 = {1,2,3};

我如何在不通过循环数组array_1的情况下检查变量variable_1的值是否等于数组array_1中的任何一个值?


4
一般而言,在多值结构中检查存在性需要进行一定量的循环。如果您的应用程序出现了瓶颈(通过分析得出是由于循环引起的),您可以添加索引以加速处理。在.NET中,最简单的方法可能是使用Dictionary或HashSet。 - James Kolpack
3个回答

26

好的,某些东西必须进行循环。以下任何一种都可以:

bool exists = array.Contains(variable_1);
bool exists = Array.IndexOf(array_1, variable_1) != -1;
bool exists = Array.Exists(array_1, x => x == variable_1);
bool exists = Array.FindIndex(array_1, x => x == variable_1) != -1;
bool exists = array_1.Any(x => x == variable_1);

对我来说,使用所有使用lambda表达式的版本都感觉过度庞大,但如果你发现自己处于某种情况下不知道实际要搜索的值 - 仅是某些条件,则它们可能很有用。

如果您知道数组已排序,您可以使用:

bool exists = Array.BinarySearch(array_1, variable_1) >= 0;

这将是O(log n)而不是O(n)(其他所有方法都是O(n)),但它确实需要先对数组进行排序。

个人而言,我通常会使用第一种形式-假设您正在使用.NET 3.5或更高版本。

如果您需要检查多个项目并且数组很大,则可能需要创建一个HashSet<int>

HashSet<int> hashSet = new HashSet<int>(array_1);
bool exists = hashSet.Contains(variable_1);

18

在3.5及以上版本中

array_1.Contains(variable_1);
或者 2.0
array_1.IndexOf(variable_1) != -1

更新:为了节省性能


6
为了寻找一个值而创建一个新的列表对我来说感觉有点过度。即使在2.0中,您仍然可以使用Array.IndexOf、Array.Exists、Array.FindIndex等方法。 - Jon Skeet
当然!array_1.IndexOf(variable_1) != -1 就可以完成这个任务。 - Junior Mayhé

1

嗯,有各种不同的选项,

var hasItem = Array.Exists(array_1, x => x == variable_1);

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