2010-04-04 56 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