如何检查C#中的值是否在数组中?
就像,我想创建一个包含打印机名称列表的数组。
这些将被提供给一个方法,该方法将依次查看每个字符串,如果该字符串与数组中的值相同,则执行该操作。
例如:
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")
?
答案 0 :(得分:179)
添加必要的命名空间
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"");
}
答案 1 :(得分:22)
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)假
答案 2 :(得分:19)
if ((new [] {"foo", "bar", "baaz"}).Contains("bar"))
{
}
答案 3 :(得分: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"");
}
}
答案 4 :(得分:4)
你的方法中缺少一些东西:
public void PrinterSetup(string printer)
{
if (printer == "jupiter")
{
Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
}
}
只需添加string
即可。
答案 5 :(得分:4)
public static bool Contains(Array a, object val)
{
return Array.IndexOf(a, val) != -1;
}
答案 6 :(得分:3)
不清楚你的问题是什么,但听起来你想要这样的东西:
List<string> printer = new List<string>( new [] { "jupiter", "neptune", "pangea", "mercury", "sonic" } );
if( printer.Exists( p => p.Equals( "jupiter" ) ) )
{
...
}
答案 7 :(得分:3)
注意:问题是关于字符串数组。提到的例程不能与单个字符串的.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");
}
}
你可以编写一个自己的扩展方法(C#3.0及以上版本)来添加语法糖,以获得所有数组的字符串相同的“.Contains”,而不包括Linq:
// Using the generic extension method below as requested.
public void PrinterSetup(string[] printer)
{
if (printer.Contains("jupiter"))
{
Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
}
}
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。
其他地方提到.Contains方法引用List<T>.Contains
(自C#2.0)或ArrayList.Contains
(自C#1.1以来),但不是直接引用数组本身。
答案 8 :(得分:2)
为了查找性能,请考虑使用HashSet<T>
Class:
此方法是O(1)操作。
例如:
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");
}
// ...
}
}
答案 9 :(得分:1)
我现在搜索了2h,找到了一个很好的方式如何在列表中找到重复项以及如何删除它们。这是最简单的答案:
//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!
的新列表中删除重复元素