2 Stimmen

Unterschied zwischen zwei "where "s in LINQ

Bitte erklären Sie mir den Unterschied zwischen dem "where" in (1) und dem "where()" in (2).

Wann sind "where" und "where()" zu verwenden?

List<Person> pList = 
new List<Person>
  {  
       new Person
             {EmpNo=1,FirstName="Marc",LastName="Loel",Salary=3434},

       new Person
             {EmpNo=2, FirstName="Steve",LastName="Kaith",Salary=4545},       

       new Person 
             {EmpNo=3,FirstName="Neol",LastName="Henk",Salary=2222},          

   };

 (1) var v = from p in pList where p.EmpNo == 1 select new { p.FirstName };

 (2)  var query =pList .Where(p => p.EmpNo == 1)
                               .Select(p => new { p.FirstName});

25voto

Eric Lippert Punkte 628543

Der Unterschied besteht darin, dass die eine Form leichter zu lesen ist und die andere schwieriger zu lesen. Das Problem ist, dass etwa die Hälfte der Menschen die erste Form für einfacher hält und die andere Hälfte die zweite für einfacher! Wählen Sie die Form, die Ihnen am besten gefällt, und bleiben Sie dabei; sie bedeuten genau dasselbe.

6voto

StriplingWarrior Punkte 141402

Es gibt keinen wirklichen Unterschied. Das erste where (und select) ist ein spezieller sprachinterner Abfrageausdruck, der vom Compiler in die anderen lambda-basierten Where- und Select-Methoden übersetzt wird.

5voto

BFree Punkte 100035

Das ist nur syntaktischer Zucker. Wenn Sie nur eine Klasse mit der richtigen Where-Methode haben, können Sie die syntaktische Magie nutzen, selbst wenn die Klasse nicht aufzählbar ist:

class MyClass
{
    public IQueryable<int> Where(Func<int, bool> predicate)
    {
        return Enumerable.Range(1, 100).AsQueryable();
    }
}

static void Main(string[] args)
{
    var q = from p in new MyClass()
            where p == 10
            select p;      
}

Dies tut nichts, aber es baut und ruft diese Methode auf.

0 Stimmen

Das ist ein toller Trick. Ich nehme an, so werden zusätzliche LINQ-Anbieter erstellt?

0 Stimmen

Genau so wird es gemacht. Es gibt einen Mitarbeiter von Microsoft, der ein Video von Channel 9 hat und diese Technik verwendet, um den Simpsons Linq zu demonstrieren. Lustiges Zeug :) Er arbeitet im Moment an Linq to Powershell. Wenn ich das Video finde, werde ich es mit einem Link aktualisieren.

2voto

empi Punkte 15455

Es gibt keinen Unterschied. Nummer (1) ist nur mit etwas syntaktischem Zucker geschrieben.

Ein kurzer Blick auf den Code in Reflektor zeigt folgendes Bild:

var v = pList.Where<Person>(delegate (Person p) {
    return (p.EmpNo == 1);
}).Select(delegate (Person p) {
    return new { FirstName = p.FirstName };
});
var query = pList.Where<Person>(delegate (Person p) {
    return (p.EmpNo == 1);
}).Select(delegate (Person p) {
    return new { FirstName = p.FirstName };
});

Wie Sie sehen können, sind sie genau gleich.

2voto

Matt Sherman Punkte 8013

Ich glaube, sie sind identisch. Microsoft hat die Syntax in (1) aus Gründen der Lesbarkeit erstellt, aber der Compiler behandelt sie als (2).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X