TOC

This article has been localized into Czech by the community.

LINQ:

Omezení dat: Metody Take() a Skip()

Doposud jsme v této kapitole o LINQ v tutoriálu objevili několik způsobů, jak pracovat s datovými zdroji pomocí LINQ. Nyní přišel čas zjistit, jak můžeme omezit množství dat, se kterými pracujeme. To je obzvláště užitečné při použití databáze jako datového zdroje, protože často zahrnuje obrovské množství řádků, jejichž načítání je náročné na zdroje.

Metody, o kterých budeme v tomto článku diskutovat, se nazývají Take() a Skip(), a v kombinaci jsou skvělé pro věci jako je stránkování na webové stránce. Ve skutečnosti se často používají společně, ale samozřejmě mohou být použity i samostatně. Metoda Take() vám poskytne X počet položek z datového zdroje, zatímco Skip() vám umožní ignorovat prvních X položek. Jednoduchý příklad by mohl vypadat takto:

List<string> names = new List<string>()
{
    "John Doe",
    "Jane Doe",
    "Joe Doe",
    "Jenna Doe",
};
var middleNames = names.Skip(1).Take(2).ToList();
foreach (var name in middleNames)
    Console.WriteLine(name);

Vytvoříme jednoduchý seznam jmen a poté, pro výstup, přeskočíme první jméno (Skip(1)) a poté vezmeme další dvě jména (Take(2)), což nám v podstatě nechá jen dvě prostřední jména ze seznamu.

Základní stránkování s použitím Skip() a Take()

Jak můžete vidět, metody Take() a Skip() jsou velmi jednoduché na použití, ale jsou zajímavější na demonstraci s více daty, než jsme dosud používali, proto jsem si dovolil vytvořit trochu složitější příklad, který lépe ukáže, jak vám tyto metody mohou pomoci. Nejprve zde, je kód:

using System;
using System.Globalization;
using System.Linq;
using System.Xml.Linq;

namespace LinqTakeSkip1
{
    class Program
    {
static void Main(string[] args)
{
    CultureInfo usCulture = new CultureInfo("en-US");
    XDocument xDoc = XDocument.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
    var cubeNodes = xDoc.Descendants().Where(n => n.Name.LocalName == "Cube" && n.Attribute("currency") != null).ToList();
    var currencyRateItems = cubeNodes.Select(node => new
    {
Currency = node.Attribute("currency").Value,
Rate = double.Parse(node.Attribute("rate").Value, usCulture)
    });


    int pageSize = 5, pageCounter = 0;
    var pageItems = currencyRateItems.Take(pageSize);
    while(pageItems.Count() > 0)
    {
foreach (var item in pageItems)
    Console.WriteLine(item.Currency + ": " + item.Rate.ToString("N2", usCulture));
Console.WriteLine("Press any key to get the next items...");
Console.ReadKey();
pageCounter++;
// Here's where we use the Skip() and Take() methods!
pageItems = currencyRateItems.Skip(pageSize * pageCounter).Take(pageSize);
    }
    Console.WriteLine("Done!");
   
}
    }
}

To je docela dost kódu, ale pojďme si to projít. V první polovině parsovat veřejně dostupný zdroj XML kurzů měn To mi dává možnost stručně vám ukázat LINQ to XML, což je velmi zajímavá část ekosystému LINQ. LINQ to XML budeme diskutovat v jiném článku, ale prozatím jen vězte, že ho používáme k vytažení důležitých uzlů z XML zdroje a vložení je do anonymních objektů, skládajících se z názvu a aktuálního směnného kurzu měny, které později použijeme.

Teď máme hezký zdroj informací o měnách ve v proměnné currencyRateItems. V poslední polovině příkladu používáme tento zdroj k jednoduchému stránkování - jednoduše vytáhneme 5 položek a pak požádáme uživatele, aby stiskl klávesu, aby získal dalších 5 (nebo kolik jich ve zdroji zbylo). To děláme tak, že extrahujeme prvních 5 položek a poté použijeme while smyčku k průběžnému vytahování dalších 5 položek, dokud zdroj není prázdný. Získání dalších 5 položek je provedeno kombinací metod Skip() a Take() - základ tohoto článku.

Shrnutí

Metody Skip() a Take() jsou velmi jednoduché na použití, ale přesto velmi užitečné v mnoha situacích. Jak bylo zmíněno, často se používají společně, ale zejména metoda Take() může být použita i samostatně.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!