Jak sprawdzić, czy wartość znajduje się w tablicy w języku C #?
Na przykład chcę utworzyć tablicę z listą nazw drukarek.
Zostaną one przekazane do metody, która przyjrzy się każdemu ciągowi po kolei, a jeśli ciąg jest taki sam jak wartość w tablicy, wykonaj tę czynność.
Na przykład:
string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
foreach (p in printer)
{
PrinterSetup(p);
}
To są nazwy drukarek, które są podawane do metody PrinterSetup.
PrinterSetup będzie wyglądać mniej więcej tak (jakiś pseudokod):
public void PrinterSetup(printer)
{
if (printer == "jupiter")
{
Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
}
}
Jak sformatować if (printer == "jupiter")
w sposób, który C # może rozpoznać?
printer.Equals("jupiter")
. Jeśli to pierwsza, użyjlinq
iprinter.Contains("jupiter")
printer.Equals("jupiter")
... Kod OPif (printer == "jupiter")
działa dobrze ... o ileprinter
jest zadeklarowany jako ciąg, jak zauważa Skeet.Odpowiedzi:
Dodaj niezbędną przestrzeń nazw
Następnie możesz użyć
Contains()
metody linqźródło
How do I check if a value is in an array in C#?
), a także skuteczny. Bez pętli bez dodatkowej metody. Tylko przestrzeń nazw jest dodatkowa, co nie jest wielką rzeczą.((IList)printer).Contains("Jupiter")
nieogólne (może zawierać typy wartości itp.) I działa nawet dla tablic wielowymiarowych. A od .NET 2.0 mamy bardziej magiczny,((IList<string>)printer).Contains("Jupiter")
który jest bardziej bezpieczny dla typów. Podejście Linq było nowością w .NET 3.5.1) Prawda 2) Fałsz 3) Prawda 4) Fałsz
źródło
źródło
Coś takiego?
źródło
źródło
a
jest to tablica wielowymiarowa (new string[10, 20, 15]
na przykład), z wyjątkiem. Nie powiedzie się również w przypadku tablic jednowymiarowych, które nie są indeksowane od zera (na przykładArray.CreateInstance(typeof(string), new[] { 5, }, new[] { -2, })
rzadkie w C #, przyznaję), z prawdopodobnie nieprawidłową wartością zwracaną. Te niedociągnięcia można łatwo naprawić za pomocą leków generycznych:public static bool Contains<TElement>(TElement[] a, TElement val) { return Array.IndexOf(a, val) != -1; }
Uwaga: pytanie dotyczy tablic ciągów. Wymienionych procedur nie należy mieszać z metodą .Contains dla pojedynczych ciągów.
Chciałbym dodać rozszerzającą odpowiedź odnoszącą się do różnych wersji C # iz dwóch powodów:
Przyjęta odpowiedź wymaga Linq, który jest doskonale idiomatycznym C #, ale nie przychodzi bez kosztów i nie jest dostępny w C # 2.0 lub niższym. W przypadku tablic wydajność może mieć znaczenie, więc są sytuacje, w których chcesz pozostać przy metodach Array.
Żadna odpowiedź nie odnosi się bezpośrednio do pytania, w którym poproszono również o umieszczenie tego w funkcji (ponieważ niektóre odpowiedzi są również mieszaniem łańcuchów z tablicami ciągów, nie jest to całkowicie nieważne).
Array.Exists () to metoda C # / .NET 2.0 i nie wymaga Linq. Wyszukiwanie w tablicach to O (n). Aby uzyskać jeszcze szybszy dostęp, użyj HashSet lub podobnych kolekcji.
Od .NET 3.5 istnieje również metoda ogólna
Array<T>.Exists()
:Możesz napisać własną metodę rozszerzenia (C # 3.0 i nowsze), aby dodać cukier składniowy, aby uzyskać takie same / podobne „.Contains”, jak w przypadku ciągów znaków dla wszystkich tablic bez uwzględniania Linq:
W tym przypadku
ArrayContains()
używana jest ta metoda, a nie metoda Contains z Linq.Wspomniane gdzie indziej .Contains metody odwołują się do
List<T>.Contains
(od C # 2,0) lubArrayList.Contains
(od C # 1.1), ale nie bezpośrednio do tablic.źródło
Po prostu brakuje Ci czegoś w Twojej metodzie:
Po prostu dodaj
string
i wszystko będzie dobrze.źródło
Nie bardzo jasne, na czym polega Twój problem, ale wygląda na to, że chcesz czegoś takiego:
źródło
Rozważ użycie
HashSet<T>
Class ze względu na wydajność wyszukiwania:Na przykład:
źródło
Przeszukałem teraz ponad 2 godziny, aby znaleźć fajny sposób, jak znaleźć duplikaty na liście i jak je usunąć . Oto najprostsza odpowiedź:
Wynik będzie wyglądał następująco: Zduplikowane elementy zostaną usunięte z nowej listy o nazwie odrębne!
źródło