web-dev-qa-db-ja.com

値が配列内にあるかどうかを確認します(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")をフォーマットするにはどうすればよいですか?

81

必要な名前空間を追加する

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"");
}
180
Dmytro
   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)True 2)False 3)True 4)False

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

}  
19
Guest

このようなもの?

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

あなたのメソッドに何かが欠けています:

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

stringを追加するだけで大​​丈夫です。

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

あなたの問題が何であるかはあまり明確ではありませんが、次のようなものが欲しいようです:

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

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

注:問題は文字列の配列に関するものです。上記のルーチンは、単一の文字列の.Containsメソッドと混合しないでください。

異なるC#バージョンを参照する拡張回答を追加したいと思います。これには2つの理由があります。

  • 受け入れられた答えにはLinqが必要です。Linqは完全に慣用的なC#ですが、コストなしでは提供されず、C#2.0以下では使用できません。配列が関係する場合、パフォーマンスが重要になる可能性があるため、配列メソッドを使い続けたい状況があります。

  • これを関数に入れるように求められた質問には直接答えがありません(一部の答えは文字列の配列と文字列を混合しているため、これは完全に重要ではありません)。

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

Linqを含めずに、すべての配列の文字列に対して同じ「.Contains」を取得するために、独自の拡張メソッド(C#3.0以降)を記述して構文糖を追加できます。

// 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以降)を参照しますが、配列自体は直接参照しません。

3
Philm

ルックアップのパフォーマンスのために、 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");
        }
        // ...
    }
}
2
Sergey Brunov

リスト内で重複を見つける方法それらを削除する方法をうまく見つけるために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!という新しいリストから削除されます。

1
Ricardo Fercher