如何在不规则数组中查找唯一值

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

唯一项的总数为5

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

2个回答

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();

提醒读者一下...这个答案和Mark Byers的回答本质上是相同的,只是语法不同。根本的答案是“Select Many”。 :) - jrista

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接