2012-03-07 35 views
10

Tôi nhận được Danh sách loại khung thực thể vi và muốn chỉ trả lại các giá trị riêng biệt từ Danh sách. Tôi đang sử dụng cách tiếp cận sau đây, tuy nhiên nó không phải là duy nhất danh sách. Bất kỳ đề xuất?Tạo danh sách tùy chỉnh riêng biệt trong C#

Param: List<Flag> flags

List<Flag> distinctFlags = flags.Distinct().ToList(); 

Các giá trị của cờ như sau: ID, Flag, FlagValue. Tôi có thể sử dụng LINQ trong trường hợp này?

Cảm ơn.

+0

giá trị đầu vào của bạn là gì và làm những gì bạn mong đợi như đầu ra? –

+0

Đây có phải là bên trong hoặc bên ngoài một dbcontext không? Vui lòng hiển thị thêm mã. Và nếu bạn có thể, đưa ra một ví dụ về dữ liệu trước và sau khi chuyển đổi. –

+1

Nhóm họ lên và chọn người chiến thắng. http://stackoverflow.com/questions/489258/linq-distinct-on-a-particular-property/491832#491832 –

Trả lời

14

Giả sử Flag là một trong các mô hình tổ chức của bạn, bạn có thể sử dụng partialclass và ghi đè EqualsGetHashCode. Điều này cũng giả định rằng bạn có thuộc tính Id trên số Flagclass của bạn để nhận dạng nó.

//this namespace MUST match the namespace of your entity model. 
namespace Your.Entity.Model.Namespace 
{ 
    public partial class Flag 
    { 
     public override bool Equals(object obj) 
     { 
      var item = obj as Flag; 

      if (item == null) 
      { 
       return false; 
      } 

      return this.Id.Equals(item.Id); 
     } 

     public override int GetHashCode() 
     { 
      return this.Id.GetHashCode(); 
     } 
    } 
} 

Cách sử dụng sẽ trông như thế này

List<Flag> distinctFlags = allFlags.Distinct().ToList(); 
+1

Bạn cũng nên triển khai 'IEquatable 'trên loại. – svick

+0

Và có thể ghi đè '==' và '! =' –

+0

Bạn chỉ cần triển khai 'Equals' &' GetHashCode'. Chỉ cần chắc chắn rằng giá trị mã băm của bạn không bao giờ thay đổi - giá trị PHẢI được IMMUTABLE. – Enigmativity

1

lẽ flags là danh sách các loại tài liệu tham khảo, và khác biệt không làm việc như bạn mong đợi! Điều này bởi vì Distinct() làm việc không phải trên giá trị của lá cờ trong danh sách, nhưng trên tài liệu tham khảo bộ nhớ của nó (đó là tất cả differents).

Bạn phải viết một lớp so sánh hướng dẫn cách phân biệt cách so sánh cờ bằng nhau. Giả sử bạn có lớp cờ này:

public class flag 
{ 
    public string Name { get; set; } 
    public string Code { get; set; } 
} 

bạn nên tạo một lớp Comparer như thế này:

class FlagComparer : IEqualityComparer<flag> 
{ 
    // Products are equal if their names and product numbers are equal. 
    public bool Equals(flag x, flag y) 
    { 

     //Check whether the compared objects reference the same data. 
     if (Object.ReferenceEquals(x, y)) return true; 

     //Check whether any of the compared objects is null. 
     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 

     //Check whether the products' properties are equal. 
     return x.Code == y.Code && x.Name == y.Name; 
    } 
} 

và gọi tuyên bố của bạn:

List distinctFlags = flags.Distinct(new FlagComparer()).ToList(); 

Bằng cách này, phương pháp riêng biệt biết chính xác cách so sánh bằng cờ istance.

CẬP NHẬT

Dựa trên nhận xét của bạn, nếu bạn wanto để làm theo gợi ý của tôi, bạn nên viết cơ sở Comparer như sau:

class FlagComparer : IEqualityComparer<flag> 
    { 
     // Products are equal if their names and product numbers are equal. 
     public bool Equals(flag x, flag y) 
     { 

      //Check whether the compared objects reference the same data. 
      if (Object.ReferenceEquals(x, y)) return true; 

      //Check whether any of the compared objects is null. 
      if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
       return false; 

      //Check whether the products' properties are equal. 
      return x.HostID == y.HostID && x.RuleID == y.RuleID && x.Flag == y.Flag && x.FlagValue == y.FlagValue; 
     } 
    } 

Tất nhiên, tất cả các tài sản phải là một kiểu giá trị .

Hãy xem ở đây để làm rõ bản thân:

+1

Điều này sẽ làm việc, nhưng ghi đè 'Equals()' và thực hiện 'IEquatable ' là cách tiếp cận phổ biến hơn, bởi vì nó có nghĩa là bạn không phải chỉ định bộ so sánh mỗi lần. – svick

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