Szukając odpowiedzi na to pytanie, natknąłem się na podobne z użyciem LINQ, ale nie byłem w stanie ich w pełni zrozumieć (a tym samym zaimplementować), ponieważ nie jestem z nimi zaznajomiony. Zasadniczo chciałbym to zrobić:
- Sprawdź, czy którykolwiek element listy zawiera określony ciąg.
- Jeśli tak, zdobądź ten element.
Naprawdę nie wiem, jak bym to zrobił. Oto co mogę wymyślić (oczywiście nie działa):
if (myList.Contains(myString))
string element = myList.ElementAt(myList.IndexOf(myString));
Wiem DLACZEGO to nie działa:
myList.Contains()
nie zwracatrue
, ponieważ sprawdza, czy cały element listy pasuje do podanego przeze mnie ciągu.myList.IndexOf()
nie znajdzie wystąpienia, ponieważ, jak ma to miejsce ponownie, sprawdzi, czy występuje element pasujący do łańcucha.
Nadal nie mam pojęcia, jak rozwiązać ten problem, ale myślę, że będę musiał użyć LINQ, jak zasugerowano w podobnych pytaniach do mojego. Biorąc to pod uwagę, jeśli tak jest w tym przypadku, chciałbym, aby osoba odpowiadająca wyjaśniła mi użycie LINQ w ich przykładzie (jak powiedziałem, nie przejmowałem się tym w swoim czasie z C #). Z góry dziękuję chłopaki (i dziewczęta?).
EDYCJA: mam rozwiązanie; po prostu przejrzyj listę, sprawdź, czy bieżący element zawiera ciąg, a następnie ustaw ciąg równy bieżącemu elementowi. Zastanawiam się jednak, czy istnieje wydajniejszy sposób niż ten?
string myString = "bla";
string element = "";
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Contains(myString))
element = myList[i];
}
myString
, w bieżącej pętli otrzymasz ostatni element. To zależy od Ciebie, czy chcesz znaleźć pierwszą, czy ostatnią, jeśli chcesz znaleźć pierwszą, a następnie przerwij pętlę po znalezieniu przedmiotu.Odpowiedzi:
Powinieneś być w stanie użyć Linq tutaj:
Jeśli chcesz po prostu zwrócić pierwszy pasujący przedmiot:
źródło
Where
zeFirstOrDefault
w drugim przypadkumyList.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString))
matching
kompilator (var
)? Skoro wiem, że moja lista jest typuString
, czystring matching
w takim przypadku byłoby bezpiecznie jej używać ?Podstawowa odpowiedź brzmi: musisz przejść przez pętlę i sprawdzić, czy dowolny element zawiera określony ciąg. Powiedzmy, że kod to:
Równoważny, ale zwięzły kod to:
Tutaj x jest parametrem, który działa jak „item” w powyższym kodzie.
źródło
źródło
Klasyczne pętle są prawie zawsze najszybsze.
źródło
Jeśli chcesz listę ciągów zawierających twój ciąg:
Inną opcją jest użycie Linq FirstOrDefault
Pamiętaj, że
Contains
metoda rozróżnia wielkość liter.źródło
Możesz użyć
FirstOrDefault
metody rozszerzenia Linq :Spowoduje to zwrócenie pierwszego elementu, który zawiera podciąg
myString
, lubnull
jeśli takiego elementu nie zostanie znaleziony.Jeśli potrzebujesz tylko indeksu, użyj metody
List<T>
klasyFindIndex
:To zwróci indeks pierwszego elementu, który zawiera podłańcuch
myString
, lub-1
jeśli takiego elementu nie zostanie znaleziony.źródło
Wiele dobrych odpowiedzi tutaj, ale używam prostej, używając Exists , jak poniżej:
źródło
Powinieneś móc użyć czegoś takiego, dla mnie zadziałało dobrze:
lub coś takiego, jeśli chcesz sprawdzić, gdzie nie pasuje.
źródło
możesz użyć
LINQ zapewnia możliwości „odpytywania” dowolnego zbioru danych. Możesz użyć składni takiej jak zapytanie do bazy danych (wybierz, gdzie itp.) W kolekcji (tutaj kolekcja (lista) ciągów).
więc robisz coś w stylu "pobierz mi pozycje z listy, gdzie spełnia dany warunek"
wewnątrz pola Gdzie używasz „wyrażenia lambda”
krótko powiedzieć wyrażenie lambda jest czymś w rodzaju (parametr wejściowy => wartość zwracana)
więc dla parametru „item” zwraca „item.Contains („ wymagany ciąg znaków ”)”. Więc zwraca prawdę, jeśli element zawiera ciąg i tym samym zostanie wybrany z listy, ponieważ spełnił warunek.
źródło
Aby było to proste, użyj tego;
Alternatywnie, aby zrobić to z pętlą for, użyj this;
źródło
Nie widziałem opcji bool w innych odpowiedziach, więc mam nadzieję, że poniższy kod komuś pomoże.
Po prostu użyj
Any()
źródło
Możliwe jest połączenie Any, Where, First i FirstOrDefault; lub po prostu umieść predykat w dowolnej z tych metod, w zależności od tego, co jest potrzebne.
Prawdopodobnie powinieneś unikać używania First, chyba że chcesz, aby wyjątek był zgłaszany, gdy nie zostanie znalezione dopasowanie. FirstOrDefault jest zwykle lepszą opcją, o ile wiesz, że zwróci wartość domyślną typu, jeśli nie zostanie znalezione żadne dopasowanie (wartość domyślna ciągu to null, int to 0, bool to false itd.).
Przetestuj ten kod @ https://rextester.com/TXDL57489
źródło