2013-04-24 26 views
6

Đây có thể là một câu hỏi ngu ngốc nhưng tôi luôn sử dụng LINQ để chọn các mục.Có thể thực hiện thao tác danh sách bằng LINQ không?

Nhưng tôi muốn biết liệu có thể thực hiện tác vụ đơn giản sau đây bằng các từ khóa của nó hay không.

List<OrdersInfo> ordersList 
. 
. 
. 
foreach(OrdersInfo OI in ordersList) 
     if(OI.TYPE == "P") 
      OI.TYPE = "Project"; 
     else 
     OI.TYPE = "Support"; 
+2

LINQ có nghĩa là không có đột biến. Nếu bạn muốn thao tác, hãy sử dụng 'foreach'. – Jon

+0

Cảm ơn mọi người – AngelicCore

Trả lời

4

Không, LINQ(Language-Integrated Query) là một truy vấn ngôn ngữ và nó thực sự tỏa sáng trong consise định nghĩa truy vấn, nhưng không phải lúc nào cũng tốt ở chỗ quá (tốc độ và/hoặc quan tâm bộ nhớ).

Nếu bạn muốn sửa đổi bộ sưu tập, hãy giữ nguyên cách bạn đã làm điều đó.

+0

Tigran, tôi đồng ý với hầu hết các câu trả lời của bạn, nhưng Bạn có thể sửa đổi danh sách bằng LINQ. (Mặc dù không nên) – Habib

+0

+1, câu trả lời duy nhất là "Không". – user7116

1

LINQ là để truy vấn bộ sưu tập, Đối với sửa đổi vòng lặp hiện tại của bạn là dễ đọc hơn và tiếp cận tốt hơn, nhưng nếu bạn muốn LINQ tùy chọn sau đó:

Nếu OrderInfo là một lớp (loại tài liệu tham khảo), sau đó bạn có thể sửa đổi các thuộc tính của đối tượng, (Bạn không thể gán cho chúng null hoặc tham chiếu mới).

var ordersList = new List<OrdersInfo>(); 
ordersList.Add(new OrdersInfo() { TYPE = "P" }); 
ordersList.Add(new OrdersInfo() { TYPE = "S" }); 
ordersList.Add(new OrdersInfo() { TYPE = "P" }); 
ordersList.Select(r => (r.TYPE == "P" ? r.TYPE = "Project" : r.TYPE = "Support")).ToList(); 

Với lớp học của bạn định nghĩa là:

class OrdersInfo 
{ 
    public string TYPE { get; set; } 
} 

Dưới đây là ảnh chụp màn hình enter image description here

Điều thú vị là tôi không gán kết quả trở lại ordersList

+0

Xin vui lòng nếu downvoter có thể trỏ đến những sai lầm – Habib

+0

Không chắc chắn về một sai lầm cú pháp, có lẽ là sai lầm cho thấy ai đó làm thế nào để làm điều này bằng cách sử dụng LINQ? – user7116

+0

@sixlettervariables, về mặt chính xác, tôi thực sự đã thử nghiệm nó trong VS. Tôi đồng ý nó không nên được thực hiện thông qua LINQ và tôi có điều đó cũng như trong sự khởi đầu của câu trả lời của tôi, nhưng được downvoted cho thấy nếu nó có thể ... hmm. thats mới cho tôi :) – Habib

6

Bạn có thể sử dụng ForEach tôi thod của lớp List.

ordersList.ForEach(oi => oi.TYPE = oi.TYPE == "P" ? "Project" : "Support"); 

Nếu bạn muốn có phương pháp ForEach trong kiểu IEnumerable bạn có thể tạo mở rộng ForEach của riêng bạn

public static void ForEach<T>(this IEnumerable<T> en, Action<T> action) 
{ 
    foreach(T item in en) 
    { 
     action(item); 
    } 
} 
1

ForEach không phải là một giải pháp LINQ, nhưng có vẻ như nó là:

ordersList.ForEach(OI => OI.TYPE = OI.TYPE == "P" ? "Project" : "Support"); 

Sẵn có trên số List<T> thể hiện, không phải trên IEnumerable<T>.

+0

Xin lỗi tôi không nhìn thấy câu trả lời của bạn – binard

+0

Chúng tôi đăng cùng một lúc, và chúng tôi ở đây để giúp đỡ, không phải để cạnh tranh :) –

+0

Tôi không hiểu OI trùng lặp.TYPE – AngelicCore

Các vấn đề liên quan