Я хотел бы знать, как я могу считать количество уникальных значений в зубчатом массиве.
Мой объект области содержит свойство строки, которое имеет пространство delimitered значения.
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
, содержащий все значения, а затем вызовите 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();