2010-04-04 54 views
5

我想知道如何計算鋸齒陣列中唯一值的數量。如何在鋸齒陣列中找到唯一值

我的域對象包含具有空格分隔值的字符串屬性。

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

給出一個列表爲MyObject的我怎麼能確定的唯一值的數量?

以下linq代碼返回鋸齒陣列值的數組。一個解決方案是存儲一個臨時的單個數組項,循環遍歷每個鋸齒狀數組,如果值不存在,則添加它們。然後,一個簡單的計數將返回唯一的數值。但是,想知道是否有更好的解決方案。

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

下面是一個更可讀的例子:

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

從所有價值的唯一項目是V1V2V3V4V5

唯一項目的總數是。

是否有解決方案,可能使用linq,只返回唯一值或返回唯一值的數量?

回答

8

是的,用LINQ這很簡單。首先使用SelectMany扁平化交錯數組爲IEnumerable<string>包含所有的值,然後調用Distinct只選擇唯一值:

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

如果你想指望他們再使用Count

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

查詢表達方法是

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

只是給讀者一個參考......這個答案和馬克·拜爾斯的回答實際上是一樣的用不同的語法。根本的答案是「選擇多個」。 :) – jrista 2010-04-04 23:23:18