2010-02-14 28 views
8

Tôi đang cố gắng để có được một danh sách riêng biệt của những lời từ một mảng các từ với đoạn mã sau:Chọn biệt Danh sách từ từ Array với LINQ

string words = "this is a this b"; 

var split = words.Split(' '); 

IEnumerable<Word> distinctWords = (from w in split 
          select new Word 
            { 
             Text = w.ToString() 
            } 
         ).Distinct().ToList(); 

Tôi nghĩ điều này sẽ đưa ra sự xuất hiện của đôi 'this' nhưng nó trả về một danh sách của mỗi từ int anh ấy cụm từ.

Ai đó có thể đề xuất cách tôi có thể đi về việc nhận danh sách riêng biệt? Cảm ơn

Dave

+0

nên không phải là dòng thứ 2 được 'string [] split = lời nói. Split() '? –

+0

D'Oh! - @Mark, bạn nói đúng. Tôi đoán tôi có một chút cẩu thả với bản sao/dán của tôi - Tôi đã sửa nó ngay bây giờ. Tôi đã có một hoặc hai ly ở giai đoạn đó mặc dù! :-) – DaveDev

Trả lời

19

Trong ví dụ của bạn, mỗi đối tượng Lời riêng biệt, vì không có sự so sánh mà nhìn vào thuộc tính Text.

Tuy nhiên, không có lý do để tạo ra một đối tượng mới:

var distinctWords = (from w in split 
         select w).Distinct().ToList(); 

Hoặc đơn giản hơn:

var distinctWords = new List<string>(split.Distinct()); 
1

Bạn chưa đăng mã cho lớp Word của bạn, nhưng tôi đoán là nó không thực hiện Equals với một so sánh giá trị để bạn có được thực hiện mặc định của Equals mà chỉ kiểm tra đối tượng tài liệu tham khảo. Lưu ý rằng nếu bạn quyết định triển khai phiên bản Equals của riêng mình, bạn cũng cần triển khai chính xác GetHashCode.

Một cách khác để giải quyết vấn đề này là cung cấp IEqualityComparer làm tham số cho hàm Distinct.

1

Vấn đề là, bạn tạo ra một số đối tượng Word có chứa cùng một giá trị, nhưng trình biên dịch nên biết như thế nào, rằng đây sẽ là các mục giống nhau?

Hãy thử

(from w in split.Distinct() 
select new Word { Text = w.ToString()}).ToList(); 
0

Như những người khác đã nói, vấn đề có lẽ là đối tượng Word của bạn không thực hiện cấu trúc bình đẳng (so sánh nội dung thực tế, không phải tài liệu tham khảo thể hiện). Nếu bạn vẫn muốn có được một bộ sưu tập các Word đối tượng như kết quả, nhưng sử dụng Distinct trên các giá trị chuỗi bên dưới, bạn có thể viết này:

IEnumerable<Word> distinctWords = 
    (from w in split.Distinct() 
    select new Word { Text = w.ToString() }).ToList(); 
Các vấn đề liên quan