TOC

This article is currently in the process of being translated into Vietnamese (~98% done).

LINQ:

Data transformations: the Select() method

Trong chương về LINQ của bài giảng, chúng ta đã làm việc với nguồn dữ liệu đơn giản ví dụ danh sách số nguyên, chuỗi hay đối tượng đơn giản như lớp User. Chúng ta sẽ tiếp tục làm vậy vì nó rất hữu ích khi cho bạn xem nhiều phương thức LINQ, nhưng nhớ rằng với LINQ nguồn dữ liệu có thể là XML hay cơ sở dữ liệu.

Trong bài này, chúng ta sẽ nói về phương thức Select() cho phép chúng ta lấy dữ liệu từ nguồn dữ liệu. Điều này rất hữu ích với nguồn dữ liệu lớn hơn và phức tạp hơn, như tôi đã nói trước đây nhưng chú ý rằng trong khi tôi cố gắng chỉ cho bạn phương thức Select() hoạt động ra sao và bạn có thể làm gì với nó. Như thường lệ, tôi sẽ vào trực tiếp ví dụ:

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; }  
}  
    }  
}

Chú ý cách mà tôi có thể lấy ra một danh sách các đối tượng, trong trường hợp này là User và sau đó dùng phương thức Select() để lấy ra danh sách mới. Trong ví dụ này, tôi trả về danh sách đối tượng trong danh sách chuỗi chứa tên của user. Điều này rất thực tế trong nhiều trường hợp, mà bạn cần hiển thị dữ liệu khác đi hay khi bạn chỉ cần một tập con của nó. Tất nhiên, nó cũng hoạt động theo cách mà bạn có thể dễ dàng tạo ra danh sách User từ một danh sách tên (bạn sẽ phải thêm tuổi sau):

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);

Chú ý cách tôi có thể tạo ra một đối tượng mới với phương thức Select() - thực sự là một đặc tính mạnh cho phép bạn làm nhiều thứ với dữ liệu trực tiếp! Một ứng dụng phổ biến cho chức năng này là làm cho đối tượng đơn giản hơn ví dụ trả về dịch vụ web như JSON hay XML. Tưởng tượng rằng bạn có lớp User với nhiều thuộc tính (Sinh nhật, giới tính, Mail, địa chỉ, quốc gia ...) nhưng bạn chỉ muốn trả về giới hạn các thuộc tính này - để dễ hiểu, cho bảo mật chẳn hạn, để đảm bảo bạn không trả về tên và mật khẩu. Đây là một ví dụ đơn giản - chỉ giả sử ta có lớp User phức tạp hơn:

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; }
}
    }
}

Trong ví dụ này, chúng ta dùng Select() để trả về danh sách kiểu nặc danh chứa chỉ tập con của thuộc tính trong nguồn dữ liệu. Chúng ta sau đó trả về đầu ra của các đối tượng này nhưng bạn nên tưởng tượng là chúng ta trả về cho một trang web hay cái gì đó, điều này rất quan trọng để giữ cho kết quả càng đơn giản càng tốt mà không ảnh hưởng tới bảo mật ...

Như đã nói, tôi dùng hầu hết cú pháp phương thức của LINQ trong ví dụ nhưng tất nhiên chúng ta cũng có thể dùng cú pháp truy vấn của 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);

Tôi hy vọng điều này cho bạn một ý tưởng rõ hơn về cú pháp bạn thích nhưng kết quả như nhau!

Summary

Phương thức Select() cho phép bạn chuyển và định dạng dữ liệu từ dữ liệu gốc vào dữ liệu mớ, ví dụ chọn chỉ một thuộc tính đơn hay trả về đối tượng chứa tập con các thuộc tính trong đối tượng nguồn.


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!