Powinieneś rozważyć pozostałe odpowiedzi, są one dość dokładne, co chcę ci pokazać, a może to pomoże ci zrozumieć, że składnia tego typu jest rzeczywiście reprezentowana w składni zapytania:
string[] test=new test[]{"abc","","cd","","aa"};
// this is the equivalent to your code
// added explicit type to make it clearer, it's optional
var a = from (string)x in test
where !string.IsNullOrEmpty(x)
select x;
jeśli jesteś zaznajomiony z SQL, znajdziesz to składnia łatwiejsze do odczytania, nawet jeśli o tym nie wiesz, to składnia jest czystsze.
Gdy kod jest kompilowany, to składnia kwerendy jest automatycznie tłumaczone z metodą składni C#, w celu wygenerowania IL, więc jeśli dissasmbly DLL widać metoda składni zamiast składni zapytań
krótkie wyjaśnienie na temat tego kodu:
Jak widać zmienna x
została uznana i jest typu string
. Czemu?ponieważ tablica jest tablica łańcuchów
in test
wskazuje źródło IEnumerable<>
iteracyjne - swoją tablicę w tym przypadku
where
jest dość wymowne, to po prostu wybiera wszystkie NOT NULL ciągi z tablicy
I wreszcie selekcja, która faktycznie jest rzutowaniem danych.
A wszystko to jest odpowiednikiem kodu
Teraz może być zadając sobie pytanie ... Kiedy należy używać jednej lub drugiej składni? Cóż, są one równoważne, ale operatory składni zapytania są ograniczone, co oznacza, że większość operacji odbywa się za pomocą składni metody zamiast składni zapytania. Zawsze staram się napisać kod łatwiejszy do odczytania, ale łatwiej go zrozumieć, jeśli jest napisany ze składnią zapytania.
Informacje na temat składni metody, składnia x => ...
jest znany jako wyrażenie lambda, mogą wyglądać dziwnie, jeśli jest to pierwszy raz, gdy pracujesz z nimi, ale ostatecznie będziesz je kochać.
Zasadniczo lambdas są skróty do delegatów, więc to, co robisz z:
x => !string.IsNullOrEmpty(x)
Tworzycie metody anonimowe oraz metoda jest przypisany do parametru delegata. x
reprezentuje string variable
.
Ten temat jest bardzo obszerny, aby spróbować wyjaśnić to tutaj, ale mam nadzieję, że dało ci to pojęcie o tym, co się kryje.
Btw można łączyć Składnia wygląda tak:
// this is the equivalent to your code
// added explicit type to make it clearer, it's optional
var a = (from (string)x in test
where !string.IsNullOrEmpty(x)
select x).ToArray();
Jeśli google LINQ jest jak googlowania porm lol wstęga jest nękany z artykułami LINQ, próbek, itp
dobrym punktem startu byłyby 101 próbki od Microsoft
http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
EDIT
Postaram się naśladować Gdzie metodę, dzięki czemu można mieć lepszy przykład wyrażenia lambda
// this is basically the declaration of one overload of the Where method
// the this in the parameter declaration, indicates this is an extension method which will be available to all IEnumerable<> objects
// the Func<T, bool> is the interesting part, it is basically a delegate (as a reminder, the last parameter of the Func object indicates the type that must be returned, in this case is a bool)
// the delegate is simply a pointer to a function
public IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
...some logic
... yielding back the reuslts
foreach(var r in res)
{
// here is the delegate in action
if(predicate(r))
yield return r;
}
}
Jak widać delegat został powołany jako funkcja (delegaci są wskaźnikiem do funkcji) Butt jaką funkcję?ten, który oświadczył w kodzie
x => !string.IsNullOrEmpty(x)
i x
wskazuje parametr przekazany z powrotem Where metody do kodu zewnętrznego, gdzie można zapoznać się z nim i używać go, aby filtrować wyniki
x => jest skrótem zadeklarować delegat
! string.IsNullOrEmpty (x) to ciało swojego anonimowego m etod i jak widać spełnia on wymagania Func<T, bool>
, zwraca bool (predykat do filtrowania elementów tablicy) i jako parametr otrzymał generic T
, który w tym przypadku jest ciągiem z twojej tablicy
Innym sposobem na stwierdzenie, że wyrażenie lambda jest:
test = test.Where(
(string) x =>
{
return !string.IsNullOrEmpty(x)
})
.ToArray();
z tej składni łatwo wykazać, że są one rzeczywiście metody (metod anonimowych)
http://msdn.microsoft.com/en-us /library/bb397687.aspx – archil
Zobacz te artykuły: ** http: //msdn.microsoft.com/en-us/magazine/cc163400.aspx** i ** http: //daniel.wertheim.se/ 2011/02/07/c-clean-up-your-linq-query-and-lambda-wyrażenia/** –
x zawiera jedną indywidualną wartość twojej tablicy, sprawdź moją odpowiedź, aby uzyskać więcej szczegółów – Jupaol