Tuple là một khái niệm khá “lạ”, mình gặp khái niệm này lần đầu ở Python, giờ mới biết trong C# cũng có. Có thể hiểu đơn giản tuple là 1 “cục” tập hợp của nhiều fields, tương tự như class, nhưng define nhanh và dễ hơn. Ví dụ:
1
2
3
4
| var love = new Tuple<int>(1);var lie = new Tuple<int, string>(1, "Why");var lay = new Tuple<int, int, string>(1, 2, "Gay");Console.WriteLine(lay.Item1 + " " + lay.Item2 + " " + lay.Item3);// 1 2 Gay |
Anonymous type có 1 khuyết điểm, đó là ko thể dùng anonymous type làm kiểu trả về, hoặc parameter truyền vào cho 1 function.
1
2
3
4
5
6
7
8
9
| public ??? GetStu() //Làm sao trả về { List<Student> students = new List<Student>(); var stu = students.Select(st => new {st.Name, st.Age }); return stu; }DoSomething(stu);public void DoSomething(???); // Làm sao truyền vào |
Với tuple, vấn đề đó được giải quyết nhanh chóng:
1
2
3
4
5
6
7
8
9
| public List<Tuple<string, int>> GetStu() { List<Student> students = new List<Student>(); var stu = students.Select(st => new Tuple<string, int>(st.Name, st.Age)).ToList(); return stu; }public void DoSomething( List<Tuple<string, int>> input);DoSomething(stu); |
Có thể các bạn sẽ hỏi: Tại sao ko tạo 1 class mới, dùng anonymous type với tuple làm gì cho mệt? Xin trả lời:
- Có 1 số trường hợp ta cần extract 1 số field, nếu mỗi lần lấy vài fields ta đều tạo class mới thì code sẽ khá dư và vô nghĩa.
- Nếu tạo class mới, ta phải override lại hàm Equals và GetHashCode nếu cần so sánh. Anonymous type và tuples đã tự động implement hàm này cho chúng ta.
Ví dụ:
1
2
3
4
5
6
7
8
9
|
public List<Tuple<int,int>> getSoLuongTonKho()
{
var query = from p in context.tbThuocs
where p.TrangThaiThuoc == 1
select p;
var result = query.Select(t => new { t.IdThuoc, t.SoLuongTonKho }).AsEnumerable().Select(t => new Tuple<int, int>(t.IdThuoc, t.SoLuongTonKho)).ToList();
return result;
}
|