检查数组中是否有值(C#)

Cec*_*uez 90 .net c# arrays string

如何检查C#中的值是否在数组中?

就像,我想创建一个包含打印机名称列表的数组.

这些将被提供给一个方法,该方法将依次查看每个字符串,如果字符串与数组中的值相同,则执行该操作.

例如:

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
foreach (p in printer)
{
   PrinterSetup(p);     
}
Run Code Online (Sandbox Code Playgroud)

这些是打印机的名称,它们被送到PrinterSetup方法.

PrinterSetup看起来有点像这样(一些伪代码):

public void PrinterSetup(printer)
{
   if (printer == "jupiter") 
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}
Run Code Online (Sandbox Code Playgroud)

如何if (printer == "jupiter")以C#可识别的方式格式化?

Dmy*_*tro 198

添加必要命名空间

using System.Linq;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用linq Contains()方法

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
if(printer.Contains("jupiter"))
{
    Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
}
Run Code Online (Sandbox Code Playgroud)

  • @Sami:Linq在内部使用循环. (6认同)
  • 这当然很容易和值得推荐.如果您无法访问Linq,或者不想使用Linq,则可以依赖于数组的某些_explicit接口implementation_.从.NET 1.1开始,我们有`((IList)打印机).Contains("Jupiter")`它是非泛型的(可能是盒子类型等),甚至可用于多维数组.而且从.NET 2.0开始,我们就拥有了更神奇的`((IList <string>)打印机.Contains("Jupiter")`这种类型更安全.Linq方法是.NET 3.5中的新方法. (3认同)
  • @ 0A0D.这个答案是我认为直接最好的一种最简单/最短且众所周知的方法来实现同样的事情("我如何检查一个值是否在C#中的数组中?")并且也是有效的.没有循环没有额外的方法.只是一个名称空间是额外的,这不是一件大事. (2认同)
  • @ 0A0D Sam可能是指编写代码,而不是编译指令.Linq在内部使用循环和方法,但从编码器的角度来看,所有隐藏的东西都不需要担心. (2认同)
  • 对@0A0D。我的意思是编码器/开发人员不需要正确的循环。当然,从数组检查需要一个循环:) (2认同)

小智 24

   string[] array = { "cat", "dot", "perls" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perls");
bool b = Array.Exists(array, element => element == "python");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

// Display bools.
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
----------------------------output-----------------------------------
Run Code Online (Sandbox Code Playgroud)

1)真2)假3)真4)假

  • 这应该是公认的答案.如果使用数组,那么性能并不是很重要.在这种情况下,Linq经常是错误的选择. (5认同)
  • 请注意,“并非完全不可能”并不意味着“完全可能”。在这种情况下,数组大小很可能会非常小,并且任何性能下降都将完全无法检测到。IMO 下面使用 Linq 的一行答案是最清晰的实现。 (2认同)

小智 19

if ((new [] {"foo", "bar", "baaz"}).Contains("bar"))
{

}  
Run Code Online (Sandbox Code Playgroud)

  • 这可能是一个普遍的例子,但它正是我所寻找的. (8认同)

cod*_*ife 7

像这样的东西?

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
PrinterSetup(printer);

// redefine PrinterSetup this way:
public void PrinterSetup(string[] printer)
{
    foreach (p in printer.Where(c => c == "jupiter"))
    {
        Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
    }
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*ilm 6

注意:问题是关于字符串数组。上述例程不能与单个字符串的 .Contains 方法混合使用。

我想添加一个涉及不同 C# 版本的扩展答案,原因有两个:

  • 接受的答案需要 Linq,它是完全惯用的 C#,但它并非没有成本,并且在 C# 2.0 或更低版本中不可用。当涉及数组时,性能可能很重要,因此在某些情况下您希望使用 Array 方法。

  • 没有答案直接涉及还要求将其放入函数的问题(因为有些答案也将字符串与字符串数组混合,这并非完全不重要)。

Array.Exists() 是一种 C#/.NET 2.0 方法,不需要 Linq。在数组中搜索是 O(n)。为了更快地访问,请使用 HashSet 或类似的集合。

从 .NET 3.5 开始,还存在一个通用方法Array<T>.Exists()

public void PrinterSetup(string[] printer)
{
   if (Array.Exists(printer, x => x == "jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以编写自己的扩展方法(C# 3.0 及更高版本)来添加语法糖,以获得与所有数组的字符串相同/相似的“.Contains”,但不包括 Linq:

// Using the generic extension method below as requested.
public void PrinterSetup(string[] printer)
{
   if (printer.ArrayContains("jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

public static bool ArrayContains<T>(this T[] thisArray, T searchElement)
{
   // If you want this to find "null" values, you could change the code here
   return Array.Exists<T>(thisArray, x => x.Equals(searchElement));
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用此ArrayContains()方法而不是 Linq 的 Contains 方法。

其他地方提到的 .Contains 方法是指List<T>.Contains(自 C# 2.0 起)或ArrayList.Contains(自 C# 1.1 起),但不直接指代数组本身。

  • 我建议将名称更改为 ArrayContains() 以避免与 Linq Contains() 混淆 (2认同)

Raz*_*dze 5

    public static bool Contains(Array a, object val)
    {
        return Array.IndexOf(a, val) != -1;
    }
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个。但是,如果 `a` 是一个多维数组(例如 `new string[10, 20, 15]`),它就会失败,但有一个例外。对于不是从零开始索引的一维数组,它也会失败(例如 `Array.CreateInstance(typeof(string), new[] { 5, }, new[] { -2, })`,在 C# 中很少见我承认),可能有错误的返回值。这些缺点很容易用泛型解决: `public static bool Contains&lt;TElement&gt;(TElement[] a, TElement val) { return Array.IndexOf(a, val) != -1; }` (2认同)