Új hozzászólás Aktív témák

  • Karma

    félisten

    válasz tototos #6600 üzenetére

    Ott valamit nagyon elnézel, az input változó biztosan nem egy szöveget tartalmaz. Mondjuk ha megpróbálod kiíratni, akkor tényleg ezt kaphatod.

    Az a helyzet, hogy a LINQ query szintaxis, hasonlóan a legtöbb LINQ metódushoz, nem listát ad vissza, hanem egy IEnumerable-t; leegyszerűsítve egy "képletet", hogy hogy lehet végrehajtani az általad felsorolt műveleteket. Nem is fut végig a stringlistádon ekkor még.

    Ha a visszakapott IEnumerable-ön hívsz egy ToList()-et, végigfut a ciklus és megkapod a tényleges listát.

    var lines = File.ReadLines(fileName);
    var input = (from line in lines
    where (!line.Contains("dblink"))
    select line).ToList();

    Így már input egy List<String> lesz, benne a neked kellő sorokkal.

    A metódus formában ez így nézne ki, igazából szerintem egy ilyen egyszerű szűrésnél sokkal jobban olvasható:

    var lines = File.ReadLines(fileName)
    .Where(line => !line.Contains("dblink"))
    .ToList();

    ---

    A ToListen kívül a ToArray, ToDictionary, ToLookup metódusok hívásakor, továbbá foreach ciklussal vagy XAML bindinggal is kiértékelődik a képlet.

    Nagyon oda kell figyelni arra, hogy ahány ilyet hívsz, annyiszor újrakezdi a teljes számolást! Ezért miután a képleted teljes, célszerű a ToListtel materializálni a listát, és így megspórolni a felesleges újraszámolásokat.

    ---

    Csendben kicseréltem a ReadAllLines hívást ReadLinesra. Ennek a verziónak az a hatalmas előnye, hogy nem olvassa fel azonnal a teljes fájlt a memóriába, hanem soronként dolgozza fel, ahogy materializálódik az eredmény, memóriát spórolva. Jobban is passzol a LINQ filozófiájához.

Új hozzászólás Aktív témák

Hirdetés