Как проверить, находится ли значение в массиве в 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 # мог распознать?
printer.Equals("jupiter")
. Если это первое, используйтеlinq
иprinter.Contains("jupiter")
printer.Equals("jupiter")
... Код OPif (printer == "jupiter")
работает нормально ... до тех пор, покаprinter
он объявлен как строка, как отмечает Скит.Ответы:
Добавьте необходимое пространство имен
Затем вы можете использовать
Contains()
метод linqисточник
How do I check if a value is in an array in C#?
), а также эффективно. Нет цикла, нет лишнего метода. Просто пространство имен является лишним, что не имеет большого значения.((IList)printer).Contains("Jupiter")
есть не общий (могут быть типы значений и т. Д.), Который работает даже для многомерных массивов. А начиная с .NET 2.0 у нас есть более волшебное,((IList<string>)printer).Contains("Jupiter")
более безопасное по типу. Подход Linq был новинкой в .NET 3.5.1) верно 2) неверно 3) верно 4) неверно
источник
источник
Что-то вроде этого?
источник
источник
a
это многомерный массив (например,new string[10, 20, 15]
например), за исключением. Он также потерпит неудачу с одномерными массивами, которые не проиндексированы с нуля (напримерArray.CreateInstance(typeof(string), new[] { 5, }, new[] { -2, })
, редко в C #, я признаю), с возможно неправильным возвращаемым значением. Эти недостатки легко исправить с помощью дженериков:public static bool Contains<TElement>(TElement[] a, TElement val) { return Array.IndexOf(a, val) != -1; }
Примечание: речь идет о массивах строк. Упомянутые подпрограммы не следует смешивать с методом одиночных строк .Contains.
Я хотел бы добавить расширяющий ответ, относящийся к различным версиям C #, и по двум причинам:
Для принятого ответа требуется Linq, который является совершенно идиоматическим C #, хотя он не обходится без затрат и недоступен в C # 2.0 или ниже. Когда задействован массив, производительность может иметь значение, поэтому есть ситуации, когда вы хотите остаться с методами массива.
Нет ответа непосредственно на вопрос, в котором было предложено также поместить это в функцию (поскольку некоторые ответы также смешивают строки с массивами строк, это не совсем неважно).
Array.Exists () - это метод C # /. NET 2.0, который не требует Linq. Поиск в массивах - O (n). Для еще более быстрого доступа используйте HashSet или аналогичные коллекции.
Начиная с .NET 3.5 существует также общий метод
Array<T>.Exists()
:Вы можете написать собственный метод расширения (C # 3.0 и выше), чтобы добавить синтаксический сахар, чтобы получить такие же / похожие ".Contains", что и для строк для всех массивов, без включения Linq:
В этом случае используется этот
ArrayContains()
метод, а не метод Contains в Linq.Упомянутые в другом месте методы .Contains относятся к
List<T>.Contains
(начиная с C # 2.0) илиArrayList.Contains
(начиная с C # 1.1), но не непосредственно к самим массивам.источник
Вам просто чего-то не хватает в вашем методе:
Просто добавь
string
и все будет хорошо.источник
Не очень понятно, в чем ваша проблема, но похоже, что вы хотите что-то вроде этого:
источник
Подумайте об использовании
HashSet<T>
Class для повышения производительности поиска:Например:
источник
Я искал сейчас более 2 часов, чтобы найти хороший способ найти дубликаты в списке и как их удалить . Вот самый простой ответ:
Результат будет выглядеть следующим образом: Дублированные элементы будут удалены в новом списке, который называется отличным!
источник