2013-07-18 36 views
5

Chắc chắn có một cách dễ dàng để xác minh tập hợp giá trị không có trùng lặp [sử dụng mặc định Comparison của collection 's Type] trong C#/.MẠNG LƯỚI ? Không cần phải được xây dựng trực tiếp nhưng phải ngắn gọn và hiệu quả.Làm cách nào để xác minh tập hợp các giá trị là duy nhất (không chứa bản sao) trong C#

Tôi đã nhìn rất nhiều nhưng tôi tiếp tục nhấn ví dụ về việc sử dụng collection.Count() == collection.Distinct().Count() mà đối với tôi không hiệu quả. Tôi không quan tâm đến kết quả và muốn bảo lãnh ngay sau khi tôi phát hiện một bản sao, nên đó là trường hợp.

(Tôi rất muốn xóa câu hỏi này và/hoặc câu trả lời của mình nếu ai đó có thể chỉ ra những bản sao)

+2

Sử dụng 'Khác biệt()' mà không so sánh * * sử dụng so sánh mặc định của loại. Nó không rõ ràng những gì bạn không thích về các giải pháp sử dụng 'Distinct()' ... –

+0

@JonSkeet Cập nhật Q để cho biết vấn đề của tôi với nó (Tôi không muốn kết quả và muốn dừng lại ngay). (Một bảo vệ đơn giản của nó) –

+1

Đúng vậy, đó là một câu hỏi rất khác. –

Trả lời

9

được rồi, nếu bạn chỉ muốn thoát ra ngay sau khi trùng lặp được tìm thấy, nó đơn giản:

// TODO: add an overload taking an IEqualityComparer<T> 
public bool AllUnique<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 
    var distinctItems = new HashSet<T>(); 
    foreach (var item in source) 
    { 
     if (!distinctItems.Add(item)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

... hoặc sử dụng All, như bạn đã hiển thị. Tôi cho rằng điều này hơi đơn giản để hiểu trong trường hợp này ... hoặc nếu bạn làm muốn sử dụng All, ít nhất tôi sẽ tách riêng việc tạo tập hợp khỏi chuyển đổi nhóm phương pháp, để rõ ràng:

public static bool IsUnique<T>(this IEnumerable<T> source) 
{ 
    // TODO: validation 
    var distinctItems = new HashSet<T>(); 
    // Add will return false if the element already exists. If 
    // every element is actually added, then they must all be unique. 
    return source.All(distinctItems.Add); 
} 
+0

@RubenBartelink: Tôi đã không bắt đầu viết bài của tôi, không. Tôi cũng không nhận ra rằng bạn sẽ tự trả lời. –

+0

@RubenBartelink: Tôi đã không phát hiện ra nó vì tôi đang bận bị nhầm lẫn về câu hỏi, đó là vấn đề. Dù sao, có một vài câu trả lời nhấn mạnh các khía cạnh khác nhau không gây hại. –

+0

Đã xóa tất cả các nhận xét của tôi về nội dung gọn gàng. Được chấp nhận là nhận xét trong phương pháp khuyến nông là quan trọng và tôi đã lấy chúng. –

7

Làm nó nội tuyến, bạn có thể thay thế:

collection.Count() == collection.Distinct().Count() 

với

collection.All(new HashSet<T>().Add); 

(trong đó T là loại yếu tố của bộ sưu tập của bạn)

Hoặc bạn có thể giải nén ở trên để một phương pháp khuyến nông helper [1], do đó bạn có thể nói:

collection.IsUnique() 

[1]

static class EnumerableUniquenessExtensions 
{ 
    public static bool IsUnique<T>(this IEnumerable<T> that) 
    { 
     return that.All(new HashSet<T>().Add); 
    } 
} 

(và như Jon đã chỉ ra trong câu trả lời của mình, ai thực sự nên tách và bình luận hai dòng như 'dễ thương' như vậy thường là không phải là một ý tưởng tốt)

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