161

如何检查值是否在 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");
   }
}

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

4

10 回答 10

312

添加必要的命名空间

using System.Linq;

然后你可以使用 linqContains()方法

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
if(printer.Contains("jupiter"))
{
    Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
}
于 2012-11-06T18:58:15.593 回答
43
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); // true
Console.WriteLine(b); // false
Console.WriteLine(c); // true
Console.WriteLine(d); // false
于 2014-04-08T06:02:35.600 回答
36

using System.Linq;在文件顶部添加。然后你可以这样做:

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

}  
于 2015-05-21T15:38:55.543 回答
9
    public static bool Contains(Array a, object val)
    {
        return Array.IndexOf(a, val) != -1;
    }
于 2014-03-07T11:41:27.347 回答
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"");
    }
}
于 2012-11-06T19:01:18.773 回答
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");
   }
}

您可以编写自己的扩展方法(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));
}

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

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

于 2017-05-12T17:28:45.173 回答
3

你只是在你的方法中遗漏了一些东西:

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

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

于 2012-11-06T18:59:28.720 回答
3

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

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

    if( printer.Exists( p => p.Equals( "jupiter" ) ) )
    {
        ...
    }
于 2012-11-06T19:02:23.937 回答
2

为了查找性能考虑使用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");
        }
        // ...
    }
}
于 2016-01-20T09:55:11.343 回答
1

我现在搜索了超过 2 小时,以找到一种如何在列表中查找重复项以及如何删除它们的好方法。这是最简单的答案:

//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 的新列表中删除!

于 2016-06-08T09:58:55.433 回答