2010-04-04 73 views
5

Tôi muốn biết cách tôi có thể đếm số lượng giá trị duy nhất trong một mảng có răng cưa.Cách tìm giá trị duy nhất trong mảng răng cưa

Đối tượng miền của tôi chứa thuộc tính chuỗi có các giá trị được phân tách bằng dấu cách.

class MyObject 
{ 
    string MyProperty; //e.g = "v1 v2 v3" 
} 

Cho một danh sách của MyObject 's làm thế nào tôi có thể xác định số lượng giá trị duy nhất?

Mã LINQ sau trả về một mảng các giá trị mảng được lởm chởm. Một giải pháp sẽ là lưu trữ một mảng các mục tạm thời, được lặp qua mỗi mảng bị lởm chởm và nếu các giá trị không tồn tại, để thêm chúng. Sau đó, một số đơn giản sẽ trả về số lượng giá trị duy nhất. Tuy nhiên, đã tự hỏi liệu có một giải pháp đẹp hơn hay không.

db.MyObjects.Where(t => !String.IsNullOrEmpty(t.MyProperty)) 
    .Select(t => t.Categories.Split(new char[] { ' ' }, 
     StringSplitOptions.RemoveEmptyEntries)) 
    .ToArray() 

Dưới đây là một ví dụ dễ đọc hơn:

array[0] = { "v1", "v2", "v3" } 
array[1] = { "v1" } 
array[2] = { "v4", "v2" } 
array[3] = { "v1", "v5" } 

Từ tất cả các giá trị các mặt hàng độc đáo v1, v2, v3, v4, v5.

Tổng số mục duy nhất là .

Có giải pháp nào, có thể sử dụng LINQ, chỉ trả về giá trị duy nhất hoặc trả về số lượng giá trị duy nhất không?

Trả lời

8

Có, với LINQ điều này khá đơn giản. Đầu tiên sử dụng SelectMany để làm phẳng các mảng lởm chởm vào một IEnumerable<string> chứa tất cả các giá trị và sau đó gọi Distinct để chọn các giá trị chỉ duy nhất:

IEnumerable<string> uniqueValues = array.SelectMany(x => x).Distinct(); 

Nếu bạn muốn đếm chúng sau đó sử dụng Count:

IEnumerable<string> uniqueValues = array.SelectMany(x => x).Distinct(); 
int uniqueCount = uniqueValues.Count(); 
5

Một truy vấn phương thức biểu thức là

var query = (from arr in array 
      from value in arr 
      select value).Distinct(); 
+0

Chỉ cần một FYI cho người đọc ... câu trả lời này và câu trả lời Đánh dấu là có hiệu quả giống nhau ng với cú pháp khác nhau. Câu trả lời cơ bản là "Chọn Nhiều". :) – jrista

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