Проверьте, находится ли значение в массиве (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");
   }
}

как мне форматировать if (printer == "jupiter") таким образом, что c# может распознать?

10 64

10 ответов:

добавить необходимое пространство имен

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

1) True 2)ложные 3)правда 4)ложные

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

}  

что-то вроде этого?

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

вы просто упускаете что-то в своем методе:

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

просто добавить string и ты будешь в порядке.

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

Не очень понятно, в чем ваша проблема, но похоже, что вы хотите что-то вроде этого:

    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!

Я хотел бы добавить новый ответ по двум причинам:

  • принятый ответ требует Linq, который является совершенно идиоматическим C#, хотя он не поставляется без затрат и не доступен в C# 2.0 или ниже. Когда задействован массив, производительность может иметь значение, поэтому есть ситуации, когда вы хотите остаться с методами массива.

  • нет ответа непосредственно относится к вопросу, где он был задан также поставить это в функцию (как некоторые ответы также смешивают строки с массивами строк, это не совсем неважно).

массив.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), но не для массивов себя непосредственно.

Примечание: речь идет о массивах строк. Упомянутые процедуры не должны смешиваться с другими .Содержит метод одиночных строк.