簡體   English   中英

檢查值是否在數組中(C#)

[英]Check if a value is in an array (C#)

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

添加必要的命名空間

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); // true
Console.WriteLine(b); // false
Console.WriteLine(c); // true
Console.WriteLine(d); // false

using System.Linq; 在文件的頂部。 然后你可以這樣做:

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

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

像這樣的東西?

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"");
    }
}

注意:問題是關於字符串數組的。 上述例程不能與單個字符串的 .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 起),但不直接指數組本身。

你只是在你的方法中遺漏了一些東西:

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

只需添加string ,你會沒事的。

不是很清楚你的問題是什么,但聽起來你想要這樣的東西:

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

    if( printer.Exists( p => p.Equals( "jupiter" ) ) )
    {
        ...
    }

為了查找性能考慮使用HashSet<T>

此方法是 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");
        }
        // ...
    }
}

我現在搜索了超過 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 的新列表中刪除!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM