2012-06-01 9 views
10

Jestem naprawdę mylić zrozumieć jego wewnętrznej pracujących to składnię LINQZrozum linq składni

string[] test = new test[] { "abc", "", "cd", "", "aa" }; 
test = test.Where(x => !string.IsNullOrEmpty(x)).ToArray(); 

Jestem zagubiony, gdzie składnia jak to udaje. czy umieszcza całą tablicę na x? jeśli tak, to w jaki sposób zarządza x wartością zerową?

lub

Jeśli nie, wartości macierzy testu umieścić jeden za drugim w kierunku x?

+0

http://msdn.microsoft.com/en-us /library/bb397687.aspx – archil

+0

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/** –

+0

x zawiera jedną indywidualną wartość twojej tablicy, sprawdź moją odpowiedź, aby uzyskać więcej szczegółów – Jupaol

Odpowiedz

10

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)

2

EDIT

Przeczytaj ten artykuł na pewno dostać dobry pomysł, o które zostały writtnen ......

C# 3.0 New Language Features (Part 1)

C# 3.0 New Language Features (Part 2)


to z z extenstion method + lambda experssion część C# 3.0

tutaj w tym kodzie

test=test.Where(x => !string.IsNullOrEmpty(x)).ToArray(); 

where - to metoda extesion

x => !string.IsNullOrEmpty(x) - jest lambda expresion, która jest zastąpienie funkcji anonimowej

cała ta funkcja sprawdzić każdy element tablicy ... tj. wyrażenie wyrażenia lamdaba sprawdza, czy każdy element tablicy spełnia warunki, które są zapisane, a następnie w końcu zwraca tablicę tych elementów, które spełniają warunek

6

może weźmiemy objaśniające ent od siebie i zbadać kawałki jeden po drugim

x => !string.IsNullOrEmpty(x) jest w zasadzie definiowania funkcji jak poniżej

bool Filter(string x){ 
    return !string.IsNullOrEmpty(x) 
} 

i tworzy orzecznika w oparciu o tej funkcji. Predykat jest po prostu delegatem - funkcją, którą można przekazać w zmiennej.

.Where jest metoda rozszerzenie, które dla uproszczenia można zdefiniować

IEnumerable<T> Where<T>(this IEnumerable<T> sequence,Predicate<T> pred){ 
    foreach(var elem in sequence){ 
     if(pred(elem)){ 
      yield return elem; 
     } 
    } 
} 

miał zdefiniowano funkcję jako Filter jest zdefiniowany powyżej zamiast używać lambda Twój rachunek będzie wyglądać następująco

test = test.Where(Filter).ToArray(); 

więc wywołując tę ​​metodę rozszerzenia w twojej tablicy i przekazując powyższy predykat będziesz iterować nad wszystkimi elementami w tablicy i zwrócić wszystkie elementy pasujące do predykatu (tj. te, które są nowe r zerowy ani mieć wartość pusty ciąg)

końcu wywołać metodę rozszerzenia .ToArray() który zamienia co .Where zwrócony (an IEnumerable<string>) do tablicy

Powiązane problemy