2009-02-02 40 views
13

Nếu bạn có một danh sách làm thế nào để bạn trả lại hàng nếu một tài sản được chỉ định hoặc tập hợp các thuộc tính tồn tại?List.Contains (mục) với danh sách chung của các đối tượng

public class Testing 
{ 
    public string value1 { get; set; } 
    public string value2 { get; set; } 
    public int value3 { get; set; } 
} 
public class TestingList 
{ 
    public void TestingNewList() 
    { 
     var testList = new List<Testing> 
          { 
           new Testing {value1 = "Value1 - 1", value2 = "Value2 - 1", value3 = 3}, 
           new Testing {value1 = "Value1 - 2", value2 = "Value2 - 2", value3 = 2}, 
           new Testing {value1 = "Value1 - 3", value2 = "Value2 - 3", value3 = 3}, 
           new Testing {value1 = "Value1 - 4", value2 = "Value2 - 4", value3 = 4}, 
           new Testing {value1 = "Value1 - 5", value2 = "Value2 - 5", value3 = 5}, 
           new Testing {value1 = "Value1 - 6", value2 = "Value2 - 6", value3 = 6}, 
           new Testing {value1 = "Value1 - 7", value2 = "Value2 - 7", value3 = 7} 
          }; 

     //use testList.Contains to see if value3 = 3 
     //use testList.Contains to see if value3 = 2 and value1 = "Value1 - 2" 


    } 
} 

Trả lời

23

Nếu bạn đang sử dụng .NET 3.5 hoặc tốt hơn, LINQ là câu trả lời cho cái này:

testList.Where(t => t.value3 == 3); 
testList.Where(t => t.value3 == 2 && t.value1 == "Value1 - 2"); 

Nếu không sử dụng .NET 3.5 thì bạn có thể chỉ lặp qua và chọn ra những người thân bạn muốn.

+0

Tại sao phải nhập LINQ khi Tìm, Tìm và tồn tại đã được xác định cho danh sách? – bdukes

+0

@bdukes Phản hồi nhận xét của Necro, chỉ cần không nhận thấy nó trước :) Tìm trong các phiên bản trước 3.5 sử dụng toán tử bình đẳng đối tượng để xác định sự bình đẳng. Bạn có thể cung cấp của riêng bạn, nhưng trước khi 3,5 nó là một nỗi đau. Nhưng kể từ khi 3,5 họ thêm phiên bản lambda, nơi bạn có thể xác định sự bình đẳng khi cần thiết. Tôi đã nói LINQ vì đó là điều đầu tiên tôi nghĩ về điều đó phù hợp với yêu cầu của anh ấy, nhưng tôi nghĩ rằng bạn nói đúng, nếu bạn đã có một Danh sách, bạn nên sử dụng các toán tử dựng sẵn. Nếu anh ta có cái gì khác mà không có, LINQ sẽ phù hợp với hóa đơn. – CubanX

+0

Vâng, có nhiều cách khác. Nhưng 1 để nhắc tôi rằng tôi có thể sử dụng: 'SiteList.Where (s => s.GLCode == glcode);' trong mã của tôi. :-) – cbmeeks

17

Nhìn vào phương thức Find hoặc FindAll của lớp List<T>.

+0

LINQ bị lạm dụng ??? Tôi cảm thấy rằng đôi khi, phải không? 1 cho sự đơn giản – Perpetualcoder

26

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

testList.Exists(x=>x.value3 == 3) 
+0

+1 cho khả năng sử dụng của tôi và cảm ơn bạn đời –

+0

+1 một lần nữa cho khả năng sử dụng. Ngoài ra http://stackoverflow.com/questions/1938204/linq-where-vs-findall – ruffrey

7

Nếu bạn muốn sử dụng thực hiện của lớp bình đẳng, bạn có thể sử dụng phương pháp Contains. Tùy thuộc vào cách bạn xác định bình đẳng (theo mặc định nó sẽ là tham chiếu, sẽ không có bất kỳ trợ giúp nào), bạn có thể chạy một trong các thử nghiệm đó. Bạn cũng có thể tạo nhiều IEqualityComparer<T> s cho mỗi bài kiểm tra bạn muốn thực hiện. Ngoài ra, đối với các bài kiểm tra không chỉ dựa vào sự bình đẳng của lớp, bạn có thể sử dụng phương thức Exists và chuyển qua một đại biểu để kiểm tra (hoặc Find nếu bạn muốn tham chiếu đến ví dụ phù hợp).

Ví dụ, bạn có thể xác định sự bình đẳng trong lớp Testing như vậy:

public class Testing: IEquatable<Testing> 
{ 
    // getters, setters, other code 
    ... 

    public bool Equals(Testing other) 
    { 
     return other != null && other.value3 == this.value3; 
    } 
} 

Sau đó, bạn sẽ kiểm tra nếu danh sách chứa một mục với value3 == 3 với mã này:

Testing testValue = new Testing(); 
testValue.value3 = 3; 
return testList.Contains(testValue); 

Để sử dụng Exists, bạn có thể thực hiện các thao tác sau (đầu tiên với ủy quyền, thứ hai với lambda):

return testList.Exists(delegate(testValue) { return testValue.value3 == 3 }); 

return testList.Exists(testValue => testValue.value3 == 2 && testValue.value1 == "Value1 - 2"); 
1

Một truy vấn LINQ có lẽ sẽ là cách dễ nhất để viết mã này.

Testing result = (from t in testList where t.value3 == 3 select t).FirstOrDefault(); 
+0

Trong C# bạn cần một mệnh đề lựa chọn trong biểu thức truy vấn. Việc sử dụng phương thức Where trực tiếp trong trường hợp này là dễ dàng hơn, IMO. –

+0

Rất tiếc. Đã thêm lựa chọn. Quá nhiều nảy giữa vb.net và C#. –

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