20 Stimmen

Ihre bevorzugten LINQ-to-Objects-Abfragen

Mit LINQ lassen sich viele Programmierprobleme einfacher lösen - und das mit weniger Codezeilen.

Was sind die besten Beispiele für die reale Welt? LINQ-to-Objects Abfragen, die Sie geschrieben haben?

(Beste = Einfachheit und Eleganz im Vergleich zum C# 2.0 / imperativen Ansatz).

8voto

Cameron MacFarland Punkte 67889

Null-Elemente in einer Liste herausfiltern.

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

Erstellen Sie ein Wörterbuch, bei dem der Schlüssel der Wert einer Eigenschaft ist und der Wert die Anzahl, wie oft diese Eigenschaft in der Liste erscheint.

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

4voto

MichaelGG Punkte 9900

LINQ ist lediglich die Erweiterung von C#/VB um einige funktionale Programmierkonzepte. Daher werden die meisten Dinge sehr viel einfacher. C# 2.0 hatte tatsächlich etwas davon - siehe die List-Methoden, zum Beispiel. (Allerdings war die Syntax für anonyme Methoden in C# 2.0 zu langatmig.)

Hier ist ein kleines Beispiel:

static readonly string badChars = "!@#$%^&*()";
bool IsUserNameValid(string userName) {
  return userName.Intersect(badChars).Any();
}

3voto

Alexander Prokofyev Punkte 32808

Beispiel 1

Gibt eine Liste mit den Namen aller verfügbaren Instanzen von SQL Server innerhalb des lokalen Netzwerks zurück

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

Erzeugt einen nicht verwendeten Namen für eine 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
        );
}

2voto

Bent Rasmussen Punkte 5312

Ich habe zwei schön absurde, 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);
}

Allerdings sind diese als Abfrageoperatoren gekapselt, so dass sie wiederverwendet werden können, z. B. für binäres Parsing

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

2voto

Igal Tabachnik Punkte 30660

Wenn Sie eine abgegrenzte Name=Value Zeichenfolge, wie zum Beispiel "ID=2;Name=James;Age=32;" und Sie wollen dies schnell in ein Wörterbuch verwandeln, können Sie verwenden:

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

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