2015-10-05 15 views
19

xem xét xây dựng JavaScript phổ biến sau đâyVí dụ về array.map() trong C#?

var ages = people.map(person => person.age);

Cho kết quả mong muốn, đó là một loạt các lứa tuổi.

Điều gì tương đương với điều này trong C#? Vui lòng bao gồm một ví dụ đơn giản. Tài liệu cho biết select hoặc có thể selectAll nhưng tôi không thể tìm thấy ví dụ trực tuyến hoặc bất kỳ câu hỏi SO nào khác có thể được dán vào và hoạt động.

Nếu có thể, hãy đưa ra ví dụ biến mảng sau {1,2,3,4} thành {'1a','2a','3a','4a'} sau đây. Đối với mỗi phần tử, thêm "a" vào cuối, chuyển nó từ một số nguyên thành chuỗi.

+0

Chắc chắn có gì đó với linq – Elipzer

+1

'(mới [] {1,2,3,4}). Chọn (v => String.Format (" {0} a ", v))' –

+0

@AlexeiLevenkov Bạn đã bỏ lỡ '.ToArray()' ở cuối. – Corey

Trả lời

40

Đây được gọi là phép chiếu được gọi là Select trong LINQ. Điều đó không trả lại một mảng mới (như cách JavaScript .map của bạn), nhưng là IEnumerable<T>. Bạn có thể chuyển đổi nó thành một mảng với .ToArray.

var ages = people.Select(person => person.Age).ToArray(); 

Select hoạt động với tất cả IEnumerable<T> mà mảng triển khai. Bạn chỉ cần .NET 3.5 và câu lệnh using System.Linq;.

Ví dụ thứ 2 của bạn sử dụng một cái gì đó như thế này. Lưu ý rằng không có mảng nào được sử dụng - chỉ các chuỗi.

var items = Enumerable.Range(1, 4).Select(num => string.Format("{0}a", num)); 
+0

Bạn không cần phải chuyển 'num' thành' string.Format'? –

+0

@RichardSchneider đang cập nhật. –

+0

trên C# 6: 'var items = Enumerable.Range (1, 4) .Chọn (num => string.Format ($" {num} a "));' –

1

LINQ của .Selectmap tương đương và .Aggregatefold tương đương.

var nums = new[] {1,2,3,4}; 
string[] r = nums.Select(x => x + "a").ToArray(); 
1

Phương pháp mở rộng LINQ trên bộ sưu tập cung cấp cho bạn một loạt tiện ích thực sự tiện dụng. Select là một trong số họ:

int[] arr = { 1, 2, 3 }; 
IEnumerable<string> list = arr.Select(el => el + "a"); 
string[] arr2 = list.ToArray(); 

foreach (var str in arr2) 
    Console.Write(str + " "); 

này nên đầu ra:

1a 2a 3a 

này một cách an toàn có thể được ngưng tụ đến một 1-liner:

string[] arr2 = arr.Select(el => el + "a").ToArray(); 

Một ví dụ làm việc:

https://ideone.com/mxxvfy

tài liệu liên quan:

Enumerable.Select

Basic LINQ Query Operations (C#)

+0

Điều này khác với câu trả lời của @Richard Schneider như thế nào. Ngoài ra những gì cần phải làm ToList() ?? –

5

Chỉ để biết, nếu people là một List<Person>, phương pháp ConvertAll là khá tương tự như JS của map, e.g:

var ages = people.ConvertAll<int>(person => person.age); 

Nhưng nếu bạn có một mảng và bạn muốn sử dụng bất kỳ List<T> phương pháp, bạn có thể dễ dàng đạt được điều đó bằng cách chuyển đổi biến bạn thành một danh sách từ mảng, ví dụ:

var ages = people.ToList().ConvertAll<int>(person => person.age); 

Và cuối cùng , nếu bạn thực sự cần một mảng trở lại, sau đó bạn có thể chuyển đổi nó trở lại, ví dụ:

var ages = people.ToList().ConvertAll<int>(person => person.age).ToArray(); 

Nhưng đó ví dụ cuối cùng là không tốt như những câu trả lời khác, và bạn nên sử dụng Select nếu bạn chỉ làm việc với Mảng. Nhưng nếu bạn có thể, tôi đề nghị bạn di chuyển đến List<T>, nó tốt hơn nhiều!