2009-02-04 10 views
20

Mit LINQ können viele Programmierprobleme einfacher gelöst werden - und in weniger Codezeilen.Ihre bevorzugten LINQ-to-Objects Abfragen

Was sind einige der besten realen Welt LINQ-to-Objects Abfragen, die Sie geschrieben haben?

(Beste = Einfachheit & Eleganz im Vergleich zu der C# 2.0/Imperativ-Ansatz).

+0

Eine sehr gute Frage, aber ich denke, es sollte wikified werden. – GvS

Antwort

0

Ich habe angefangen und es ist super!

var myList = from list in myObjectList select list 
+0

Entschuldigung, ich verstehe die Idee nicht. Was ist das Besondere an diesem Beispiel? – Matt

+0

@Matt Vor 7 Jahren war das ziemlich ordentlich. –

+0

@Matt, weil es eine wirklich einfache, aber leistungsstarke Möglichkeit war, schnell über die Liste zu iterieren. Von dort aus ist es einfach, where-Klauseln usw. hinzuzufügen, um _really_ tolle Ergebnisse zu erzielen. Code wäre sauber und einfach zu lesen. –

8

Nullen in einer Liste filtern.

var nonnull = somelist.Where(a => a != null); 

ein Wörterbuch erstellen, wo der Schlüssel der Wert einer Immobilie ist, und der Wert ist die Anzahl der Male, die Eigenschaft in der Liste erscheint.

var countDictionary = somelist 
    .GroupBy(a => a.SomeProperty) 
    .ToDictionary(g => g.Key, g => g.Count()); 
+3

'somelist.Where (a => a! = Null)' ist ein bisschen weniger effizient als 'somelist.OfType ()' – Gabe

4

LINQ ist lediglich die Ergänzung einiger funktioneller Programmierkonzepte zu C#/VB. Daher neigen die meisten Dinge dazu, viel einfacher zu werden. C# 2.0 hatte tatsächlich einige davon - siehe zum Beispiel die List-Methoden. (Obwohl, anonyme Methode Syntax in C# 2.0 war zu ausführlich.)

Hier ist ein kleines Beispiel:

static readonly string badChars = "[email protected]#$%^&*()"; 
bool IsUserNameValid(string userName) { 
    return userName.Intersect(badChars).Any(); 
} 
1

Wenn Sie eine Liste (dh List<Palette> palettes), die Objekte enthält, die eine andere Liste enthält (dh Palette.Colors) und wollen alle diese Teillisten in eine abzuflachen:

List<Color> allColors = palettes.SelectMany(p => p.Colors); 
3

Beispiel 1

R eturns Liste mit Namen aller verfügbaren Instanzen von SQL Server im lokalen Netzwerk

private List<string> GetServerNames() 
{ 
    return SqlDataSourceEnumerator.Instance.GetDataSources().Rows. 
     Cast<DataRow>(). 
     Select 
     (
      row => row["ServerName"].ToString() + 
        (row["InstanceName"] != DBNull.Value ? "\\" + row["InstanceName"].ToString() : "") + 
        (row["Version"] != DBNull.Value ? " (" + row["Version"].ToString().Substring(0, 3) + ")" : "") 
     ). 
     OrderBy(s => s). 
     ToList(); 
} 

Beispiel 2

Namen für neue Datei

private string NewName(string newNamePrefix, List<string> existingFileNames) 
{ 
    return newNamePrefix + 
     (existingFileNames. 
      Select 
      (
       n => 
       { 
        if (n.StartsWith(newNamePrefix)) 
        { 
         int i; 
         if (int.TryParse(n.Replace(newNamePrefix, ""), out i)) 
          return i; 
        } 

        return 0; 
       } 
      ). 
      OrderBy(i => i). 
      Last() + 1 
     ); 
} 
+0

Welche Referenz benötigen Sie für das 1. Beispiel? Ich habe es in LinqPad versucht, aber es fehlt eine Assembly-Referenz. – Matt

2

Ich habe Generiert nicht verwendet zwei schön absurd, aber elegante Beispiele, die ich liebe

public static IEnumerable<bool> Information(this byte x) 
{ 
    return Enumerable.Range(0, 8).Select(i => ((x >> i) & 1) == 1); 
} 

public static IEnumerable<bool> Information(this IEnumerable<byte> xs) 
{ 
    return xs.SelectMany(Information); 
} 

Obwohl diese als Abfrageoperatoren gekapselt sind, damit Sie sie wiederverwenden können, z. für binäre Parsing

var n = bytes.Information().Skip(3).Take(16).ToInt(); 
+0

Ich sehe - es ist eine Funktion ToBits(). Nett. –

+0

Ja; Ich bevorzuge den Namen Information, da die kleinste Informationseinheit ein bisschen ist. Es sollte eine Erweiterungseigenschaft gewesen sein, aber wir haben diese noch nicht. –

2

Wenn Sie einen begrenzten Name=Value Zeichenfolge haben, wie "ID=2;Name=James;Age=32;" und Sie wollen, dass diese in einem Wörterbuch schnell drehen, können Sie:

var dict = value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(str => str.Split('=')) 
    .ToDictionary(pair => pair[0], pair => pair[1]); 
0

ich LINQ wie auf Text verwenden wenn ich die Portierung Code:

Zum Beispiel:

String.Join("\n", @"some VB6 code 
    that I could refactor automatically 
    if FindAndReplace were a bit more powerfully 
    And I don't want to refactor by hand".Split('\n').Trim().Select(line => 
    { 
     if(line.Contains("FindAndReplace") && !line.StartsWith("//")) 
     { 
      return line.Split(" ").Last(); 
     } 
     else 
     { 
      return String.Join("_", line.Split(" ").Take(3)); 
     } 
    }); 

Sie bekommen die Idee.Mit Linq kann ich die volle Kraft von C# auf die Textumwandlung anwenden. In der Regel verwende ich es, wenn ich Code in einer Sprache habe, die ich in komplexer Weise extrahieren und manipulieren möchte. Ich werfe den Text in LinqPad und führe einen "find-replace" in Anführungszeichen aus und ersetze ihn durch doppelte Anführungszeichen Ich umgebe es von @"..." und an die Arbeit. Normalerweise kann ich in 30 Sekunden massive Codetransformationen durchführen.

0

Mein Favorit ist das folgende Linq Beispiel für dynamisch eine SQL-Tabelle aus der Northwind Datenbank Sortierung:

void Main() 
{ 

// Demonstrates dynamic ordering 

var SortExpression = "Total"; // choose ProductName or Total 
var sortAscending = true; // choose true for ascending, false for descending 

// the query to sort 
var data = (from pd in Products 
        join od in OrderDetails on pd.ProductID equals od.ProductID into DetailsByProduct 
        select new { ProductName = pd.ProductName, Total = DetailsByProduct.Count()}).ToList(); 

// the data source you can use for data binding      
var ds= (sortAscending) 
    ? data.OrderBy(x => x.GetType().GetProperty(SortExpression).GetValue(x, null)) 
    : data.OrderByDescending(x => x.GetType().GetProperty(SortExpression).GetValue(x, null)); 

ds.Dump(); 
} 

Es Ihnen erlaubt, dynamisch sortieren, indem Sie einfach auf ein Feld in den Variablen SortExpression spezifiziert und eine Sortierreihenfolge in der Variablen sortAscending.

Mit .Take(x) und .Skip(y) können Sie auch Paging einfach implementieren.