Проверьте, находится ли значение в массиве (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 ответов:
добавить необходимое пространство имен
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)ложные
что-то вроде этого?
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
и ты будешь в порядке.
Не очень понятно, в чем ваша проблема, но похоже, что вы хотите что-то вроде этого:
List<string> printer = new List<string>( new [] { "jupiter", "neptune", "pangea", "mercury", "sonic" } ); if( printer.Exists( p => p.Equals( "jupiter" ) ) ) { ... }
рассмотрите возможность использования
HashSet<T>
класс ради производительности поиска:этот метод является операцией O(1).
например:
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), но не для массивов себя непосредственно.Примечание: речь идет о массивах строк. Упомянутые процедуры не должны смешиваться с другими .Содержит метод одиночных строк.