Frage

Mir scheint etwas an LINQ zu fehlen.Für mich sieht es so aus, als würden einige der Elemente von SQL, die mir am wenigsten gefallen, in die C#-Sprache verschoben und für andere Zwecke verwendet.

Ich meine, ich konnte den Nutzen der Verwendung von SQL-ähnlichen Anweisungen für andere Dinge als Datenbanken erkennen.Aber wenn ich SQL schreiben wollte, warum nicht einfach SQL schreiben und es aus C# heraushalten?Was fehlt mir hier?

War es hilfreich?

Lösung

Bei LINQ geht es nicht um SQL.Bei LINQ geht es darum, funktionale Programmierparadigmen auf Objekte anzuwenden.

LINQ to SQL ist ein ORM, das auf der LINQ-Grundlage aufbaut, aber LINQ ist noch viel mehr.Ich verwende LINQ to SQL nicht, verwende LINQ jedoch ständig.

Übernehmen Sie die Aufgabe, den Schnittpunkt zweier Listen zu finden:

Vor LINQ erfordert diese Aufgabe das Schreiben eines verschachtelten foreach, das die kleine Liste einmal für jedes Element in der großen Liste O(N*M) durchläuft und etwa 10 Codezeilen benötigt.

foreach (int number in list1)
{
    foreach (int number2 in list2)
    {
        if (number2 == number)
        {
            returnList.add(number2);
        }
    }
}

Mit LINQ wird in einer Codezeile dasselbe ausgeführt:

var results = list1.Intersect(list2);

Sie werden feststellen, dass das nicht wie LINQ aussieht, es aber dennoch ist.Sie müssen die Ausdruckssyntax nicht verwenden, wenn Sie dies nicht möchten.

Andere Tipps

Vor:

// Init Movie
m_ImageArray = new Image[K_NB_IMAGE];

Stream l_ImageStream = null;
Bitmap l_Bitmap = null;

// get a reference to the current assembly
Assembly l_Assembly = Assembly.GetExecutingAssembly();

// get a list of resource names from the manifest
string[] l_ResourceName = l_Assembly.GetManifestResourceNames();

foreach (string l_Str in l_ResourceName)
{
    if (l_Str.EndsWith(".png"))
    {
        // attach to stream to the resource in the manifest
        l_ImageStream = l_Assembly.GetManifestResourceStream(l_Str);
        if (!(null == l_ImageStream))
        {
            // create a new bitmap from this stream and 
            // add it to the arraylist
            l_Bitmap = Bitmap.FromStream(l_ImageStream) as Bitmap;
            if (!(null == l_Bitmap))
            {
                int l_Index = Convert.ToInt32(l_Str.Substring(l_Str.Length - 6, 2));
                l_Index -= 1;
                if (l_Index < 0) l_Index = 0;
                if (l_Index > K_NB_IMAGE) l_Index = K_NB_IMAGE;
                m_ImageArray[l_Index] = l_Bitmap;
            }
            l_Bitmap = null;
            l_ImageStream.Close();
            l_ImageStream = null;
        } // if
    } // if
} // foreach

Nach:

Assembly l_Assembly = Assembly.GetExecutingAssembly();

//Linq is the tops
m_ImageList = l_Assembly.GetManifestResourceNames()
    .Where(a => a.EndsWith(".png"))
    .OrderBy(b => b)
    .Select(c => l_Assembly.GetManifestResourceStream(c))
    .Where(d => d != null)  //ImageStream not null
    .Select(e => Bitmap.FromStream(e))
    .Where(f => f != null)  //Bitmap not null
    .ToList();

Oder alternativ (Abfragesyntax):

Assembly l_Assembly = Assembly.GetExecutingAssembly();

//Linq is the tops
m_ImageList = (
    from resource in l_Assembly.GetManifestResourceNames()
    where resource.EndsWith(".png")
    orderby resource
    let imageStream = l_Assembly.GetManifestResourceStream(resource)
    where imageStream != null
    let bitmap = Bitmap.FromStream(imageStream)
    where bitmap != null)
    .ToList();

Die wirklich große Sache an LINQ hat also nichts mit Linq to SQL zu tun.Es geht um die Verbesserungen, die es für die C#-Sprache selbst mit sich brachte.

LINQ ist nicht nur ein ORM-System, da Jonathan darauf hingewiesen hat, dass es viele funktionale Programmierelemente in C# einbringt.Und Sie können damit viele „datenbankbezogene“ Dinge in normalem C#-Code erledigen.Es ist schwer zu erklären, wie unglaublich mächtig das sein kann.Bedenken Sie, wie sehr die Einbeziehung solider, gut gestalteter generischer Datenstrukturen (wie Liste, Stapel, Wörterbuch/Hash usw.) in gemeinsame Frameworks den Entwicklungsstand moderner Sprachen verbessert hat.Gerade weil die Verwendung dieser Datenstrukturen sehr verbreitet ist und die Reduzierung des intellektuellen Aufwands bei ihrer Verwendung ein großer Vorteil ist.LINQ macht nichts, was Sie nicht auch selbst tun könnten, aber es macht viele Vorgänge viel unkomplizierter und einfacher.

Betrachten Sie das altbewährte Beispiel des Entfernens von Duplikaten aus einer nicht geordneten Liste.In einer niedrigeren Sprache wie C oder C++ müssten Sie wahrscheinlich die Liste sortieren und zwei Indizes in der Liste beibehalten, während Sie Duplikate entfernen.In einer Sprache mit Hashes (Java, C#, Javascript, Perl usw.) könnten Sie einen Hash erstellen, bei dem die Schlüssel die eindeutigen Werte sind, und die Schlüssel dann in eine neue Liste extrahieren.Mit LINQ könnten Sie einfach Folgendes tun:

int[] data = { 0, 1, 3, 3, 7, 8, 0, 9, 2, 1 };

var uniqueData = data.GroupBy(i => i).Select(g => g.Key);

Da es sich bei Linq eigentlich um Monaden im SQL-Stil handelt, verwende ich es in einem Projekt, um asynchrone Webanfragen mit der Fortsetzungsmonade zu stellen, und es funktioniert wirklich gut!

Schauen Sie sich diese Artikel an:http://www.aboutcode.net/2008/01/14/Async+WebRequest+Using+LINQ+Syntax.aspx http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

Aus dem ersten Artikel:

    var requests = new[] 
    {
        WebRequest.Create("http://www.google.com/"),
        WebRequest.Create("http://www.yahoo.com/"),
        WebRequest.Create("http://channel9.msdn.com/")
    };

    var pages = from request in requests
                select
                    from response in request.GetResponseAsync()
                    let stream = response.GetResponseStream()
                    from html in stream.ReadToEndAsync()
                    select new { html, response };

    foreach (var page in pages)
    {
        page(d =>
        {
            Console.WriteLine(d.response.ResponseUri.ToString());
            Console.WriteLine(d.html.Substring(0, 40));
            Console.WriteLine();
        });
    }

Der Punkt ist, dass LINQ Ihre Abfragen in Ihre primäre Programmiersprache integriert, sodass Ihre IDE Ihnen einige Funktionen (z. B. Intellisense- und Debug-Unterstützung) bereitstellen kann, die Sie sonst nicht hätten, und es dem Compiler ermöglicht, Ihr SQL einer Typprüfung zu unterziehen Code (was mit einer normalen String-Abfrage unmöglich ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top