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

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

就像我想用打印机名称列表创build一个数组。

这些将被馈送到一个方法,它将依次查看每个string,如果string与数组中的值相同,则执行该操作。

例如:

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

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

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

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

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

添加必要的名称空间

 using System.Linq; 

那么你可以使用linq的Contains()方法

 string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"}; if(printer.Contains("jupiter")) { Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC""); } 
  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----------------------------------- 

1)正确2)错误3)正确4)错误

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

你只是缺less你的方法中的东西:

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

只需添加string ,你会没事的。

像这样的东西?

 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""); } } 
  public static bool Contains(Array a, object val) { return Array.IndexOf(a, val) != -1; } 

不是很清楚你的问题是什么,但听起来像你想要的东西是这样的:

  List<string> printer = new List<string>( new [] { "jupiter", "neptune", "pangea", "mercury", "sonic" } ); if( printer.Exists( p => p.Equals( "jupiter" ) ) ) { ... } 

为了查找性能,考虑使用HashSet<T> Class :

这个方法是一个O(1)操作。

HashSet<T>.Contains方法(T),MSDN 。

例如:

 class PrinterInstaller { private static readonly HashSet<string> PrinterNames = new HashSet<string> { "jupiter", "neptune", "pangea", "mercury", "sonic" }; public void Setup(string printerName) { if (!PrinterNames.Contains(printerName)) { throw new ArgumentException("Unknown printer name", "printerName"); } // ... } } 

我现在search超过2小时,find一个很好的方式, 如何find重复列表中,以及如何删除它们 。 这是最简单的答案:

 //Copy the string array with the filtered data of the analytics db into an list // a list should be easier to use List<string> list_filtered_data = new List<string>(analytics_db_filtered_data); // Get distinct elements and convert into a list again. List<string> distinct = list_filtered_data.Distinct().ToList(); 

输出将如下所示:重复的元素将被删除在名为distinct的新列表中!

我想添加一个新的答案,因为两个原因:

  • 接受的答案要求Linq这是完美的惯用C#,而它不是没有成本。 当涉及数组时,性能可能很重要,所以最好的答案可以留在Array方法中。

  • 没有答案直接问到它被要求的问题,也把它放在一个函数中(因为一些答案和作为初学者的读者也可以混合使用string数组的string,这不是完全不重要的)。

Array.Exists()是C#/。NET 2.0方法,不需要Linq。

由于.NET 3.5还存在一个通用方法Array<T>.Exists() 。 当使用string时,这并没有太大的区别。 后来通过扩展方法使用没有样板代码的通用数组。 但首先是最简单的例子:

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

对于相同或类似的目的,可能有相似的function。 他们只能使用一维数组(Linq没有转换也是一样的)。 只有一些这样的function:

 Array<T>.Find() Array<T>.FindAll() Array<T>.FindIndex() 

Array.ForEach()

在性能方面,可以很方便地确保数组被sorting,并使用:

 if (Array<string>.BinarySearch(printer, "jupiter")) .. 

https://msdn.microsoft.com/de-de/library/2cy9f6wb(v=vs.110).aspx

在清洁代码方面的最好例子是恕我直言,使用扩展方法:

 public void PrinterSetup(string[] printer) { if (printer.Contains("jupiter")) { Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"); } } // Define that in an independent static class public static bool Contains<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)); } 

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