如何在锯齿状数组中查找唯一值

Dav*_*vid 5 c# linq arrays jagged-arrays

我想知道如何计算锯齿状数组中唯一值的数量.

我的域对象包含一个具有空格分隔值的字符串属性.

class MyObject
{
    string MyProperty; //e.g = "v1 v2 v3"
}
Run Code Online (Sandbox Code Playgroud)

给定一个MyObject 列表,如何确定唯一值的数量?

以下linq代码返回锯齿状数组值的数组.一种解决方案是存储临时单个项目数组,循环遍历每个锯齿状数组,如果值不存在,则添加它们.然后一个简单的计数将返回唯一的值数.但是,想知道是否有更好的解决方案.

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

以下是一个更具可读性的示例:

array[0] = { "v1", "v2", "v3" }
array[1] = { "v1" }
array[2] = { "v4", "v2" }
array[3] = { "v1", "v5" }
Run Code Online (Sandbox Code Playgroud)

从所有值中,唯一项为v1,v2,v3,v4,v5.

唯一商品的总数为5.

有没有一个解决方案,可能使用linq,只返回唯一值或返回唯一值的数量?

Mar*_*ers 8

是的,使用LINQ这很简单.首先使用SelectMany将锯齿状数组展平为IEnumerable<string>包含所有值,然后调用Distinct以仅选择唯一值:

IEnumerable<string> uniqueValues = array.SelectMany(x => x).Distinct();
Run Code Online (Sandbox Code Playgroud)

如果你想计算它们,那么使用Count:

IEnumerable<string> uniqueValues = array.SelectMany(x => x).Distinct();
int uniqueCount = uniqueValues.Count();
Run Code Online (Sandbox Code Playgroud)


Ant*_*ram 5

查询表达式方法是

var query = (from arr in array
             from value in arr
             select value).Distinct();
Run Code Online (Sandbox Code Playgroud)