2012-11-06 41 views
56

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

+3

嘗試給你的參數名稱一個類型(字符串),它會很好。 –

+2

我有點困惑,因爲這個問題。你問如何檢查一個值是否在數組中,或者如何在C#中進行字符串比較?如果是後者,您可以使用'printer.Equals(「jupiter」)'。如果是前者,請使用'linq'和'printer.Contains(「jupiter」)' – newfurniturey

+0

@newfurniturey很明顯......問題很混亂,示例代碼與標題不匹配,因此答案也會混淆;爲什麼像這樣的廢話變得越來越好,超越了我。並且不需要執行'printer.Equals(「jupiter」)'...... OP的代碼'if(printer ==「jupiter」)'工作得很好......只要'printer'被聲明爲一個正如Skeet所指出的那樣。 –

回答

127

添加必要的命名空間

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

@ 0A0D。這個答案是我認爲最簡單/最短和最有名的方式來實現同樣的事情('我如何檢查一個值是否在C#中的數組?')並且效率也是最好的。沒有循環沒有額外的方法。只是一個名字空間是多餘的,這不是一件大事。 – Sami

+5

@Sami:Linq在內部使用循環。 – 2012-11-06 19:22:59

+1

@ 0A0D山姆可能指的是書面代碼,而不是編譯指令。 Linq內部使用循環和方法,但從編碼人員的角度來看,所有這些都是隱藏的,不需要擔心。 – Trisped

5

你只是缺少你的方法了一句:

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

只需添加string和你」會沒事的。

6

像這樣的東西?

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

不是很清楚你的問題,但它聽起來像是你想是這樣的:

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

    if(printer.Exists(p => p.Equals("jupiter"))) 
    { 
     ... 
    } 
4
public static bool Contains(Array a, object val) 
    { 
     return Array.IndexOf(a, val) != -1; 
    } 
+0

我喜歡這個。但是,如果'a'是一個多維數組(例如'new string [10,20,15]'),它將會失敗,但有一個例外。它也會失敗,一維數組不會被索引爲零(例如'Array.CreateInstance(typeof(string),new [] {5,},new [] {-2,})',在C#中很少見我承認),可能有錯誤的回報價值。這些缺點很容易用泛型修復:'public static bool Contains (TElement [] a,TElement val) { return Array.IndexOf(a,val)!= -1; }' –

17
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)假

+0

這應該是被接受的答案。如果你使用一個數組,這並不是完全不可能的,那麼這個性能確實很重要。在這種情況下,Linq往往是錯誤的選擇。 – Philm

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

} 
+0

這是一個普遍的例子 - 你能提供一個更好地匹配問題嗎? – kaz

+2

這可能是一個普遍的例子,但這正是我所期待的。 –

2

爲了查找性能,考慮使用HashSet<T> Class

此方法是O(1)操作。

- HashSet<T>.Contains Method (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"); 
     } 
     // ... 
    } 
} 
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(); 

輸出看起來就像這樣: 重複的元素將在名爲獨特的新名單中刪除!

0

我想補充的原因有兩個新的答案:

  • 接受的答案,需要的Linq這是完全地道的C#雖然它並非沒有成本,並且不提供C#2.0或下面。涉及數組時,性能可能很重要,所以在某些情況下您想要使用Array方法。

  • 沒有回答直接出現問題的地方,它也被問及將它放在一個函數中(因爲一些答案也是將字符串與字符串數組混合在一起,這並不是完全不重要)。

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

由於.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及以上)中加入語法糖來獲得「載」 .NET的2.0無包括LINQ所有陣列:

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的不是一個。

其他地方提到。包含方法指的是List<T>.Contains(自C#2.0開始)或ArrayList.Contains(自C#1.1開始),但不是直接與數組本身相關。

注:問題是關於字符串數組。上述例程不能與單個字符串的.Contains方法混用。