检查数值是否在数组中(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。