Проверьте, находится ли значение в массиве (С#)
Как проверить, находится ли значение в массиве на С#?
Например, я хочу создать массив со списком имен принтеров.
Они будут переданы методу, который будет поочередно смотреть на каждую строку, и если строка совпадает с значением в массиве, выполните это действие.
Например:
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")
так, чтобы С# мог распознавать?
Ответы
Ответ 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.