cách kiểm tra xem phần tử List <T> có chứa một mục có Giá trị Thuộc tính Cụ thể hay không


113
public class PricePublicModel
{
    public PricePublicModel() { }

    public int PriceGroupID { get; set; }
    public double Size { get; set; }
    public double Size2 { get; set; }
    public int[] PrintType { get; set; }
    public double[] Price { get; set; }
}

List<PricePublicModel> pricePublicList = new List<PricePublicModel>();

Cách kiểm tra xem phần tử của pricePublicListcó chứa giá trị nhất định hay không. Nói chính xác hơn, tôi muốn kiểm tra xem có tồn tại pricePublicModel.Size == 200không? Ngoài ra, nếu phần tử này tồn tại, làm thế nào để biết nó là phần tử nào?

CHỈNH SỬA Nếu Từ điển phù hợp hơn cho điều này thì tôi có thể sử dụng Từ điển, nhưng tôi sẽ cần biết cách :)

Câu trả lời:


186

Nếu bạn có một danh sách và bạn muốn biết vị trí trong danh sách tồn tại một phần tử phù hợp với một tiêu chí nhất định, bạn có thể sử dụng FindIndexphương thức instance. Nhu la

int index = list.FindIndex(f => f.Bar == 17);

Vị f => f.Bar == 17ngữ ở đâu với tiêu chí phù hợp.

Trong trường hợp của bạn, bạn có thể viết

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}

1
điều gì sẽ xảy ra nếu tôi không biết thuộc tính của giá trị đó? Ví dụ: tôi có một mục danh sách đang hiển thị "18.00", tôi không biết nó đến từ đâu nên tôi muốn kiểm tra thuộc tính wich có giá trị này không? nên về cơ bản, và similirally ví dụ này tôi không có .size hoặc .bar tôi muốn để con nó ra
Haithem Karoui

điều gì sẽ xảy ra nếu mục không tồn tại: giá trị chỉ mục sẽ là gì?
BKSpurgeon

8
LƯU Ý: Nếu phần tử không tồn tại, findIndexsẽ trả về –1. Tài liệu: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
tomloprod

1
@tomloprod đó là lý do tại sao anh ấy kiểm tra chỉ số lớn hơn hoặc bằng 0. if (chỉ số> = 0). Cũng có thể đã viết nó như thể (chỉ số> -1).
DannyC

127
bool contains = pricePublicList.Any(p => p.Size == 200);

6
Điều này là nghiêm ngặt để xem nếu một trong những tồn tại.
Daniel A. White

3
Điều này không thực sự trả lời câu hỏi. Anh ấy nói,how to know which one is it
George Johnston

15
Có thể không trả lời câu hỏi của anh ấy, nhưng nó chắc chắn đã giúp tôi, vì tôi cần xem liệu một đối tượng có tên đã cho đã tồn tại trong bộ sưu tập của tôi hay chưa. Tôi mong đợi một phương thức .Contains được cải tiến - và đây chính xác là những gì biểu thức LINQ này làm. Cảm ơn bạn.
Igor

3
Nó trả lời câu hỏi trong tiêu đề . OP giải thích trong mô tả của mình rằng anh ấy không thực sự muốn chính xác những gì anh ấy đã nói là anh ấy muốn. Tuy nhiên, có một trong số anh ta và hàng chục người trong chúng tôi tìm thấy câu hỏi này thông qua google. Tôi nghĩ điều quan trọng hơn là chúng ta có thể tìm ra câu trả lời thực sự cho câu hỏi về chức danh của anh ấy.
MGOwen

5
Nếu bất kỳ ai thử điều này và .Any () không được công nhận, bạn cần thêm bằng cách sử dụng System.Linq; ở đầu tệp của bạn.
MGOwen

32

Bạn có thể sử dụng tồn tại

if (pricePublicList.Exists(x => x.Size == 200))
{
   //code
}

13

Điều này khá dễ thực hiện bằng LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}

Có thể chỉnh sửa trực tiếp phần tử phù hợp với điều kiện này không? Không phải lấy nó và lưu trữ trong đối tượng mới, nhưng thay đổi trực tiếp?
ilija veselica

Các matchgiá trị được trả về có thể được sửa đổi (nó là PricePublicModelđối tượng mà là trong danh sách).
Jacob

Bạn không nên sửa đổi trực tiếp một đối tượng có thể là rỗng. Bạn luôn có thể làm: match.Size = 300;hoặc foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Tuy nhiên, bản thân tôi sẽ không sử dụng nó như một lớp lót.
Amy West

11

Bạn không thực sự cần LINQ cho vì đây List<T>cung cấp một phương pháp mà thực hiện chính xác những gì bạn muốn: Find.

Tìm kiếm một phần tử phù hợp với các điều kiện được xác định bởi vị từ được chỉ định và trả về lần xuất hiện đầu tiên trong toàn bộ List<T>.

Mã ví dụ:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);

4
var item = pricePublicList.FirstOrDefault(x => x.Size == 200);
if (item != null) {
   // There exists one with size 200 and is stored in item now
}
else {
  // There is no PricePublicModel with size 200
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.