Как найти уникальные значения в зазубренном массиве
-
24-09-2019 - |
Вопрос
Я хотел бы узнать, как я могу рассчитывать количество уникальных значений в зазубренном массиве.
Мой объект домена содержит строковое свойство, которое имеет определенные значения пространства.
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" }
Из всех ценностей уникальные предметы V1., V2., V3., V4., V5..
Общее количество уникальных предметов 5.
Есть ли решение, возможно, используя LINQ, который возвращает либо только уникальные значения, либо возвращает количество уникальных значений?
Решение
Да, с 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();
Другие советы
Метод выражения запроса
var query = (from arr in array
from value in arr
select value).Distinct();