Как найти уникальные значения в неровном массиве - PullRequest
5 голосов
/ 05 апреля 2010

Хотелось бы узнать, как подсчитать количество уникальных значений в зубчатом массиве.

Мой объект домена содержит строковое свойство, которое имеет значения, разделенные пробелом.

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, которое возвращает либо только уникальные значения, либо возвращает количество уникальных значений?

Ответы [ 2 ]

8 голосов
/ 05 апреля 2010

Да, с 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 голосов
/ 05 апреля 2010

Метод выражения запроса:

var query = (from arr in array
             from value in arr
             select value).Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...