TOC

This article has been localized into Czech by the community.

LINQ:

Transformace dat: Metoda Select()

Doposud jsme v této kapitole o LINQ pracovali s jednoduchými zdroji dat, například se seznamem celých čísel, řetězců nebo jednoduchými objekty, jako je třída User. Budeme v tom pokračovat, protože je to velmi praktické při ukazování příkladů různých metod LINQ, ale mějte na paměti, že zdrojem dat pro LINQ může být stejně dobře složitý XML dokument nebo obrovská databáze.

V tomto článku si povíme o metodě Select(), která vám umožní převzít data ze zdroje dat a přetvořit je na něco jiného. To může být zřejmě užitečnější u větších a složitějších zdrojů dat, jako jsou ty, o kterých jsem zmínil výše, ale i tak si se mnou pojďte prohlédnout, jak metoda Select() funguje a co s ní můžete dělat. Jak je už u nás zvykem, přejdeme rovnou na příklad:

using System;  
using System.Collections.Generic;  
using System.Linq;  

namespace LinqSelect1  
{  
    class Program  
    {  
static void Main(string[] args)  
{  
    List<User> listOfUsers = new List<User>()  
    {  
new User() { Name = "John Doe", Age = 42 },  
new User() { Name = "Jane Doe", Age = 34 },  
new User() { Name = "Joe Doe", Age = 8 },  
new User() { Name = "Another Doe", Age = 15 },  
    };  

    List<string> names = listOfUsers.Select(user => user.Name).ToList();  

    foreach (string name in names)  
Console.WriteLine(name);  
}  

class User  
{  
    public string Name { get; set; }  
    public int Age { get; set; }  
}  
    }  
}

Všimněte si, jak mohu vzít seznam objektů, v tomto případě typu User, a poté použít metodu Select() k přetvoření tohoto seznamu na nový typ seznamu. V tomto příkladu proměním seznam objektů na seznam řetězců obsahujících jména uživatelů. To je nesmírně praktické v mnoha situacích, kdy potřebujete, aby vaše data vypadala jinak, nebo když potřebujete pouze jejich podmnožinu. Samozřejmě to funguje i opačně - ze seznamu jmen můžete snadno vytvořit seznam objektů User (i když jejich věk budete muset později přidat ručně):

List<User> listOfUsers = new List<User>()
{
    new User() { Name = "John Doe", Age = 42 },
    new User() { Name = "Jane Doe", Age = 34 },
    new User() { Name = "Joe Doe", Age = 8 },
    new User() { Name = "Another Doe", Age = 15 },
};

List<string> names = listOfUsers.Select(user => user.Name).ToList();

List<User> users = names.Select(name => new User { Name = name }).ToList();

foreach (User user in users)
    Console.WriteLine(user.Name);

Všimněte si, jak mohu vytvořit nové objekty pomocí metody Select() - je to mimořádně silná funkce, která vám umožňuje dělat s vašimi daty prakticky cokoliv na počkání! Běžné využití této funkcionality je vytvořit méně složité verze objektu, například pro vrácení přes webovou službu jako JSON nebo XML. Představte si, že máte třídu User s MNOHA vlastnostmi (Narozeniny, Pohlaví, Mail, Adresa, Země atd.), ale chcete vrátit pouze omezenou sadu těchto vlastností - to by mohlo dávat smysl i z hlediska bezpečnosti, abyste se ujistili, že nevracíte běžné vlastnosti uživatele jako Uživatelské jméno a Heslo. Zde je zjednodušený příklad - představte si mnohem složitější třídu User:

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqSelect2
{
    class Program
    {
static void Main(string[] args)
{
    List<User> listOfUsers = new List<User>()
    {
new User() { Name = "John Doe", Mail = "john@doe.com", Age = 42 },
new User() { Name = "Jane Doe", Mail = "jane@doe.com", Age = 34 },
new User() { Name = "Joe Doe", Mail = "joe@doe.com", Age = 8 },
new User() { Name = "Another Doe", Mail = "another@doe.com", Age = 15 },
    };

    var simpleUsers = listOfUsers.Select(user => new
    {
Name = user.Name,
Age = user.Age
    });
    foreach (var user in simpleUsers)
Console.WriteLine(user.Name);
}

class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Mail { get; set; }
}
    }
}

V tomto příkladě používáme metodu Select() k vrácení seznamu anonymních typů, které obsahují pouze podmnožinu vlastností nalezených ve zdroji dat. Poté provedeme klasický výstup těchto objektů na konzolu, ale měli byste si představit, že je vracíme na webovou stránku nebo jinam, kde je důležité udržet výsledek co nejjednodušší, aniž byste odhalili jakékoli tajemství jako hesla atd.

Jak jsme již diskutovali, v těchto příkladech budu většinou používat syntaxi metody LINQ, ale samozřejmě operace, které provádíme v tomto příkladu, lze vyjádřit také syntaxí dotazu LINQ.

// Method syntax
var simpleUsers = listOfUsers.Select(user => new
{
    Name = user.Name,
    Age = user.Age
});

// Query syntax
var simpleUsersQ = (from user in listOfUsers
    select new
    {
Name = user.Name,
Age = user.Age
    }).ToList();

foreach (var user in simpleUsersQ)
    Console.WriteLine(user.Name);

Doufám, že to dává jasnější představu o tom, kterou syntaxi dáváte přednost, ale výsledek je samozřejmě stejný!

Shrnutí

Metoda Select() vám umožňuje transformovat a formovat data ze zdroje dat do nových variant, například výběrem pouze jedné vlastnosti nebo vracením objektů, které obsahují pouze podmnožinu vlastností nalezených na zdrojovém objektu.


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!