Подтвердить что ты не робот

Проверьте, находится ли значение в массиве (С#)

Как проверить, находится ли значение в массиве на С#?

Например, я хочу создать массив со списком имен принтеров.

Они будут переданы методу, который будет поочередно смотреть на каждую строку, и если строка совпадает с значением в массиве, выполните это действие.

Например:

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") так, чтобы С# мог распознавать?

4b9b3361

Ответ 1

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

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

Ответ 2

   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) False

Ответ 3

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

}  

Ответ 4

В вашем методе просто отсутствует что-то:

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

Рассмотрите возможность использования 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");
        }
        // ...
    }
}

Ответ 9

Я искал сейчас более 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!

Ответ 10

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

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

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

Array.Exists() - это метод С#/.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");
   }
}

Существуют аналогичные функции, которые могут быть интересны для тех же или подобных целей. Они работают только с одномерными массивами (то же самое верно для Linq без преобразования). Только некоторые из этих функций:

Array<T>.Find()
Array<T>.FindAll()
Array<T>.FindIndex()

Array.ForEach()

С точки зрения производительности, было бы удобно убедиться, массив отсортирован и использовать:

if (Array<string>.BinarySearch(printer, "jupiter"))
..

https://msdn.microsoft.com/de-de/library/2cy9f6wb(v=vs.110).aspx

Лучшим примером с точки зрения чистого кода было бы ИМХО использовать метод расширения:

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

// Define that in an independent static class
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.