Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ερώτηση πάνω σε LINQ

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 03-04-2012, 23:18. Υπάρχουν 15 απαντήσεις.
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  02-04-2012, 11:53 69886

    Ερώτηση πάνω σε LINQ

    Καλημέρα!! :)

    Σε προηγούμενο thread μου, είχε αναφερθεί ότι σε μεταβλητές List (of T) μπορείς να χρησιμοποιήσεις LINQ.

    Προς το παρόν είμαι εντελώς άσχετος με LINQ (αν και το καλοκαίρι που θα έχω ελεύθερο χρόνο μετά τη δουλειά, θα κοιτάξω να μάθω)

    Θέλω να ξέρω λοιπόν, αν γίνεται μέσω LINQ το εξής:


    Έχω μια μεταβλητή: Dim Questions As New List(Of clsQuestions)

    όπου clsQuestions είναι μια Class που περιέχει τα εξής:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Class clsQuestions
        Public Question As String
        Public ClassID As Integer
        Public ClassName As String
        Public ClassPercentage As Decimal
        Public WasMandatory As Boolean
        Public AnswerType As String
        Public Answer As String
        Public Answers As List(Of String)
        Public Points As Decimal
        Public lstAnswersPoints As List(Of Decimal)
    End Class

    Θέλω να κάνω ένα Loop για όσα questions έχουν "ClassID" = x (όπου το χ θα το αλλάζω σε ότι θέλω εγώ την κάθε φορά).

    κάτι του τύπου

    1
    2
    3
     
    For Each Question As clsQuestions In Questions where ClassID = 1
        Κάνε Κάτι
    Next

    Είχε επίσης ειπωθεί ότι στα List (of T) μπορείς να βγάλεις μέσο όρο και τέτοια πολύ εύκολα.

    Αν θεωρήσουμε ότι έχω μια List (Of Decimal), πως μπορώ να βγάλω τον μέσω όρο και το sum??


  •  02-04-2012, 12:16 69887 σε απάντηση της 69886

    Απ: Ερώτηση πάνω σε LINQ

    Η ερώτηση είναι πολύ βασική. Ο ποιό γρήγορος τρόπος να πάρεις απάντηση σε τέτοιες ερωτήσεις είναι να διαβάσεις τα tutorials που υπάρχουν. Θα βρεις πολλά tutorials και στο MSDN και γενικότερα στο internet. Επίσης, ένα εισαγωγικό βιβλίο θα βοηθήσει πολύ.

    Ο πιο αργός τρόπος που υπάρχει είναι να ρωτάς άλλους για κάθε πράγμα που συναντάς πρώτη φορά. Στον χρόνο που σου παίρνει να γράψεις την ερώτηση και να έρθει μία απάντηση, θα μπορούσες να έχεις ήδη διαβάσει κάποιο tutorial γι αυτό το θέμα. 

    Το σημαντικότερο είναι ότι ένα βιβλίο ή άρθρο θα σου δώσει μία σωστή κατεύθυνση από την αρχή μέχρι το τέλος. Σκοντάφτοντας και ρωτώντας, απλά θα πελαγοδρομήσεις καθώς θα ψάχνεις συνεχώς σε λάθος κατευθύνσεις.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-04-2012, 12:27 69888 σε απάντηση της 69887

    Απ: Ερώτηση πάνω σε LINQ

    Παναγιώτης Καναβός:
    Η ερώτηση είναι πολύ βασική. Ο ποιό γρήγορος τρόπος να πάρεις απάντηση σε τέτοιες ερωτήσεις είναι να διαβάσεις τα tutorials που υπάρχουν. Θα βρεις πολλά tutorials και στο MSDN και γενικότερα στο internet. Επίσης, ένα εισαγωγικό βιβλίο θα βοηθήσει πολύ.

    Ο πιο αργός τρόπος που υπάρχει είναι να ρωτάς άλλους για κάθε πράγμα που συναντάς πρώτη φορά. Στον χρόνο που σου παίρνει να γράψεις την ερώτηση και να έρθει μία απάντηση, θα μπορούσες να έχεις ήδη διαβάσει κάποιο tutorial γι αυτό το θέμα. 

    Το σημαντικότερο είναι ότι ένα βιβλίο ή άρθρο θα σου δώσει μία σωστή κατεύθυνση από την αρχή μέχρι το τέλος. Σκοντάφτοντας και ρωτώντας, απλά θα πελαγοδρομήσεις καθώς θα ψάχνεις συνεχώς σε λάθος κατευθύνσεις.



    Συμφωνώ. Φαίνεται ότι κατέχεις το θέμα.

    Θα μπορούσες τότε να μου συστήσεις κάποιο/α tutorial να ακολουθήσω?

    Και σίγουρα ένα βιβλίο για το καλοκαίρι. (όπως ανέφερα και στο αρχικό μου ποστ, το καλοκαίρι που θα έχω τον απαιτούμενο χρόνο θέλω μελετήσω την LINQ).


  •  02-04-2012, 13:05 69889 σε απάντηση της 69888

    Απ: Ερώτηση πάνω σε LINQ

    Άλκη καλά σου τα λέει ο Παναγιώτης. Αρκετές φορές ρωτάς πράγματα τα οποία είναι τόσο βασικά που αν το έψαχνες λίγο θα το έβρισκες αμέσως χωρίς να περιμένεις απάντηση από εδώ.

    Θα σου δώσω ένα site το οποίο θα σε βοηθήσει να ξεκινήσεις. Μέσα εκεί θα βρεις και αυτό που θέλεις και πολλά ακόμα.

    101 Visual Basic Linq Examples

    Τώρα επεδή το βλέπω να έρχεται δεν ξέρω το αντίστοιχο site για C#. Κολλημένος με την VB, τι να κάνω.

  •  02-04-2012, 13:40 69890 σε απάντηση της 69889

    Απ: Ερώτηση πάνω σε LINQ

    Ορίστε:


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
  •  02-04-2012, 18:04 69892 σε απάντηση της 69889

    Απ: Ερώτηση πάνω σε LINQ

    George Parissis:

    Άλκη καλά σου τα λέει ο Παναγιώτης. Αρκετές φορές ρωτάς πράγματα τα οποία είναι τόσο βασικά που αν το έψαχνες λίγο θα το έβρισκες αμέσως χωρίς να περιμένεις απάντηση από εδώ.

    Θα σου δώσω ένα site το οποίο θα σε βοηθήσει να ξεκινήσεις. Μέσα εκεί θα βρεις και αυτό που θέλεις και πολλά ακόμα.

    101 Visual Basic Linq Examples

    Τώρα επεδή το βλέπω να έρχεται δεν ξέρω το αντίστοιχο site για C#. Κολλημένος με την VB, τι να κάνω.


    Το ξέρω ότι έχει δίκιο. Όπως είδες συμφώνησα κι εγώ με την άποψή του. Γιαυτό και κάνω πόστ στο "αρχές προγραμματισμού" Αν δεν ήταν βασικά πράγματα και ήταν περίπλοκα τότε θα έκανα ποστ αλλού.

    Τα έχω τα 101 παραδείγματα. Έχω ήδη ρίξει μια ματιά σε κάποια, αλλά δεν έχω το χρόνο να τα δω καλά ακόμα (όπως είπα και στα προηγούμενα ποστ μου, το καλοκαίρι θα έχω χρόνο. Μετά τη δουλειά θα κοιτάξω να μάθω καλύτερο προγραμματισμό, αρχίζοντας με LINQ).

    Ο λόγος που δεν έχω χρόνο να μάθω προγραμματισμό καλύτερα είναι ότι δεν είμαι προγραμματιστής. Είμαι στο 5ο εξάμηνο, φοιτητής στην Ηλεκτρολογία (πτυχίο ηλεκτρολόγου-μηχανικού), και ταυτόχρονα δουλεύω στην Ερευνιτική ομάδα STAINS. H STAINS (STAtistics & INformation Systems Group) είναι μια ερευνιτική ομάδα στο τμήμα πληροφορικής, του Αριστοτέλειου Πανεπιστημίου Θεσσαλονίκης. Ο σκοπός της είναι η έρευνα και εκπαίδευση σε στατιστικά μοντέλα και μεθόδους διαφόρων προβλημάτων σχετικών με συστήματα πληροφορικής. Η ομάδα εξειδικεύεται σε ένα ευρύ φάσμα πολυμεταβλητών στατιστικών μεθοδολογιών, στοχαστικών και πιθανολογικών μοντέλων και αλγορίθμους βελτιστοποίησης.

    Τέλος πάντων, όπως καταλαβαίνεις ο χρόνος μου (λόγω της αδιάκοπης μελέτης για την σχολή, και του paper για την ερευνητική ομάδα) είναι πολύ περιορισμένος προς το παρόν...

    Τα "101 παραδείγματα" είναι υπερβολικά πολύ δουλειά για τώρα. Αν υπάρχει κάτι πιο μικρό που να μου δείχνει πως να κάνω αυτό που ζητάω στο ποστ (με πιθανόν επιπλέον πράγματα, αλλά όχι 101 - αυτό για το καλοκαίρι) - τότε Link me στο tutorial.


  •  02-04-2012, 18:05 69893 σε απάντηση της 69890

    Απ: Ερώτηση πάνω σε LINQ

    panagiotis_georgiadis:
    Ορίστε:

    Ευχαριστώ αλλά σε Visual Basic προγραμματίζω βασικά :)


  •  03-04-2012, 15:31 69898 σε απάντηση της 69893

    Απ: Ερώτηση πάνω σε LINQ

    Γενικότερα θα πρέπει να μπεις στην φιλοσοφία του LINQ.Ποια προβλήματα ήρθε να αντιμετωπίσει? Το LINQ έχει αυτό που λέμε πολλά flavours. Υπάρχει το LINQ to Objects, LINQ to SQL,LINQ to Entities,LINQ to XML,LINQ to Datasets.

    Για να καταλάβεις το LINQ πρέπει να μελετήσεις τα VB9.0/VB.10.0 language (compiler)  enhancements που έχουν γίνει για να δουλέψει το LINQ.Πράγματα όπως

    • Nullable data types
    • Local Type Inference - Implicitly Typed Local variables
    • Object Initialisers
    • Collection Initialisers
    • Anonymous Types
    • Extension Methods
    • Lambda expressions

    πρέπει να τα κατανοήσεις αλλιώς δεν θα καταλάβεις τι γίνεται με το LINQ.


    Μετά να δεις την ανατομία ενός LINQ query-θα σου φανεί λίγο παράξενο στην αρχή. Να δεις αν θα γράφεις τα LINQ queries με query syntax & operators ή με Lambda expressions & Linq methods

    Π.χ

    string[] DNZNickNames = { "nikos", "kostas", "apostolis", "giorgos" };

    query syntax:

     IEnumerable<string> names = from fn in DNZNickNames

                                                where fn.StartsWith("n")

                                                select fn;

     

    method syntax:

    IEnumerable<string> names = DNZNickNames.Where(fn => fn.StartsWith("n"));


    Στην συνέχεια θα πρέπει να δεις πράγματα όπως LINQ Projection,LINQ Ordering,Grouping,Set operators,Quantifiers.


    Επίσης να δεις τι τύπου data sources μπορείς να "ρωτάς" με LINQ queries. Να δώσεις έμφαση στο IEnumerable & IQueryable Interface.



    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  03-04-2012, 15:51 69899 σε απάντηση της 69898

    Απ: Ερώτηση πάνω σε LINQ

    Μιλώντας για τα πράγματα μετά το ίσον (=), και το query syntax και το Method syntax που έγραψες είναι εύκολα κατανοητά.

    Το IEnumerable δεν έχω ιδέα τι σημαίνει ή τι είναι καν..


    Ήταν ήδη προφανές ότι είχα πολλά να μάθω - αλλά βλέποντας αυτά που είπες για τη μελέτη imporevemnts σε VB9/10, και απο τα Nullable Data Type ως Lamba expressions, έχω την εντύπωση ότι αυτά που πρέπει να μάθω είναι ακόμα παραπάνω απόσο περίμενα!

    Η LINQ είναι integral part της γλώσσας τελικά έ?


    Δεν πειράζει - όρεξη για μάθηση υπάρχει. Θα τα πάρω ένα ένα αυτά που είπες, και σε συνδυασμό με τα 101 παραδείγματα και τη βιβλιοθήκη του MSDN, θα τα μάθω όλα το καλοκαίρι.


    Προς το παρόν χρειάζομαι να ξέρω αν γίνεται μέσω LINQ το εξής:


    Έχω μια μεταβλητή: Dim Questions As New List(Of clsQuestions)

    όπου clsQuestions είναι μια Class που περιέχει τα εξής:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Class clsQuestions
        Public Question As String
        Public ClassID As Integer
        Public ClassName As String
        Public ClassPercentage As Decimal
        Public WasMandatory As Boolean
        Public AnswerType As String
        Public Answer As String
        Public Answers As List(Of String)
        Public Points As Decimal
        Public lstAnswersPoints As List(Of Decimal)
    End Class

    Θέλω να κάνω ένα Loop για όσα questions έχουν "ClassID" = x (όπου το χ θα το αλλάζω σε ότι θέλω εγώ κάθε φορά).

    κάτι του τύπου

    1
    2
    3
     
    For Each Question As clsQuestions In Questions where ClassID = 1
        Κάνε Κάτι
    Next

    Είχε επίσης ειπωθεί ότι στα List (of T) μπορείς να βγάλεις μέσο όρο και τέτοια πολύ εύκολα.

    Αν θεωρήσουμε ότι έχω μια List (Of Decimal), πως μπορώ να βγάλω τον μέσω όρο και το sum??


  •  03-04-2012, 16:09 69900 σε απάντηση της 69899

    Απ: Ερώτηση πάνω σε LINQ

    Ο Νίκος μάλλον τα έμπλεξε τα πράγματα. 

    Το LINQ είναι ένα API για να κάνεις queries σε αντικείμενα, είτε αυτά είναι στη μνήμη είτε "κάπου αλλού". Η σύνταξη του είναι η ίδια, απ' όπου και αν προέρχονται τα αντικείμενα. Ο κάθε LINQ provider από πίσω αναλαμβάνει να μετατρέψει το query που δίνεις στην κατάλληλη μορφή και να το εκτελέσει.

    Όσον αφορά τη σύνταξη και το For Each .... κοίτα τα παραδείγματα. Είναι κυριολεκτικά το παράδειγμα #1 στο Restriction Samples
    Επίσης, κοίτα και το documentation Learn Visual Basic. Υπάρχει ξεχωριστή στήλη για LINQ.

    Όσον αφορά τo IEnumerable είναι βασική έννοια, η οποία υπάρχει από καταβολής .NET και σε αυτή βασίζεται το For Each. Είναι απλά το interface που υλοποιούν όλα τα collections και arrays.

    Απλά πιάσε ένα οποιοδήποτε εισαγωγικό βιβλίο για VB.NET ή C#, τα εξηγούν όλα αυτά από την αρχή σχεδόν.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-04-2012, 16:28 69901 σε απάντηση της 69900

    Απ: Ερώτηση πάνω σε LINQ

    Δεν είναι αυτό... βλέπεις εκεί έχει μια απλή μεταβλητή() με κάποια νούμερα μέσα. Οπότε μετά λέει "δημιουργώ μια νέα μεταβλητή και μέσα βάζω όσα αντικείμενα είναι στο numbers και είναι <5"

    Εγώ έχω μια λίστα, όπου η λίστα απαρτίζεται από κλάσεις, όπου η κάθε κλάσει έχει μέσα της μεταβλητές, μεταβλητές() και μεταβλητές(of T).


    Και σαν να μην έφτανε αυτό, αυτό που γίνεται εκεί είναι ότι δημιουργεί μια νέα μεταβλητή - και το for each γίνεται στην νέα μεταβλητή. Έτσι ξέρω να το κάνω κι εγώ...

    Το θέμα είναι αν γίνεται να κάνω "For Each" στη λίστα(απο κλάσεις) όπου μια μεταβλητή μέσα στην κλάση έχει την τάδε τιμή.


    Τέλος πάντων - δεν πειράζει. Δεν είναι λες και δεν μπορώ να το κάνω με άλλο τρόπο.. απλώς θα μου άρεσε αν το είχα κάνει με LINQ. Θα βάλω το ποστ σαν "Έχει επιλυθεί".


  •  03-04-2012, 17:33 69902 σε απάντηση της 69886

    Απ: Ερώτηση πάνω σε LINQ

    Μπορείς να το κάνεις και χωρίς LINQ χρησιμοποιώντας τα Extentions methods όπως το Sum και το Average. Δες αν θες τα παρακάτω παραδείγματα που σου δείχνουν διαφορετικούς τρόπους.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
            Dim decimals As New List(Of Decimal)
            Dim result As Decimal
    
            decimals.AddRange(New Decimal() {1, 2, 3, 4})
    
            result = decimals.Sum(Function(val)
                                      If val > 1 Then
                                          Return val
                                      Else
                                          Return 0
                                      End If
                                  End Function)
    
            result = decimals.Average()
    
            ' --------------------------------
    
            result = Aggregate dec In decimals
                     Where dec > 1
                     Into Sum()
    
            result = Aggregate dec In decimals
                     Where dec Mod 2D = 0
                     Into Average()
    
            ' ------------------------------
    
            Dim Questions As New List(Of Question)
    
            Questions.AddRange(New Question() {
                                                New Question With {.ClassID = 1, .Points = 10},
                                                New Question With {.ClassID = 2, .Points = 15}
                                            })
    
            result = (From question In Questions
                     Where question.ClassID >= 1
                     Select question.Points).Sum
    
            ' ή
    
            result = Aggregate question In Questions
                     Where question.ClassID >= 1
                     Into Sum(question.Points)
  •  03-04-2012, 18:04 69903 σε απάντηση της 69902

    Απ: Ερώτηση πάνω σε LINQ

    Πολλά μπορείς να κάνεις με LINQ, ακόμα και αυτό που ζητάει ο Άλκης. Και τα Extension methods είναι πολύ όμορφα. Αλλά τα προβλήματα αρχίζουν όταν
    - άλλοι developers που βλέπουν τον κώδικά σου δεν καταλαβαίνουν τι εννοείς με ένα lambda expression
    - θές εκτός από ευανάγνωστο κώδικα να είναι και γρήγορος. Και εκεί τα extension methods με την εμπειρία μου είναι λίγο πίσω (αν κοιτάξεις το Enumerable.Sum() με τον .NET Reflector θα δεις ότι έχει null checks που μπορεί να είναι περιττά)
    Σε κάθε περίπτωση θα συνιστούσα κι εγώ πρώτα εκμάθηση της γλώσσας και των .NET 2.0 libraries πρώτα, και ύστερα μόνο εκβάθυνση σε άλλες κατευθύνσεις.


    Panagiotis Georgiadis
    HBM Netherlands B.V.
    www.twitter.com/HimWithCurls
  •  03-04-2012, 18:33 69904 σε απάντηση της 69902

    Απ: Ερώτηση πάνω σε LINQ

    @Libra Storm

    Πολύ ωραίο! Δοκιμάζω τα πάντα αυτή τη στιγμή :) :) :)

    Ευχαριστώ !! Big Smile

    Ξέρω ότι το:

    1
    2
    3
     
            result = (From question In Questions
                     Where question.ClassID >= 1
                     Select question.Points).Sum

    είναι LINQ.

    Αυτό σημαίνει ότι το:

    1
    2
    3
     
            result = Aggregate question In Questions
                     Where question.ClassID >= 1
                     Into Sum(question.Points)

    Είναι Extention Method?

    @panagiotis_georgiadis

    Δεν έχω καθόλου εμπειρία οπότε δεν μπορώ να εκφέρω γνώμη.. But i'll take your word for it, θα χρησιμοποιώ LINQ πιο πολύ - άλλωστε είναι αρκετά πιο ευανάγνωστη. Το άλλο με μπέρδεψε



  •  03-04-2012, 22:54 69910 σε απάντηση της 69904

    Απ: Ερώτηση πάνω σε LINQ

    Και τα 2 παραδείγματα χρησιμοποιούν LINQ. Το 1ο παράδειγμα είναι συνδυασμός LINQ και extention method ((IEnumerable(Of Decimal)).Sum, παρατήρησε τις παρενθέσεις ().Sum) ενώ το 2ο LINQ. Απλά το κάνουμε σε μία "κίνηση".

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            ' 1. LINQ
            Dim q As IEnumerable(Of Decimal) = From question In Questions
                                               Where question.ClassID >= 1
                                               Select question.Points
    
            ' 2. Extention method
            result = q.Sum
    
            ' ή και τα 2 προηγούμενα σε μία "κίνηση"
            result = (From question In Questions
                     Where question.ClassID >= 1
                     Select question.Points).Sum

     

    Τα extention methods είναι ένας τρόπος να προσθέσουμε sub ή function σε μ'ια class χωρίς να την κληρονομήσουμε.

    Extension Methods (Visual Basic)

Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems