LINQ - хорошая вещь в работе с Autodesk Vault
Во время программирования под Vault, в конечном счете, вам приходится много работать с массивами. Оказывается, что вам постоянно необходимо перебирать массивы для того, чтобы найти один искомый объект. Либо массив объектов необходимо перевести в массив ID.
У .NET 3.0 есть хорошая особенность, LINQ, которая позволяет осуществлять эти операции значительно проще, чем создавать циклы foreach при каждом удобном случае. Это в основном, синтаксис запросов для коллекций .NET. Если вы фанат SQL, у вас не возникнет никаких проблем при работе с LINQ. Даже если вы незнакомы с SQL, с этим синтаксисом достаточно легко работать.
Допустим вы хотите найти специфическое определение свойства в массиве объектов PropDef.
- PropDef [] fileProps = propSvc.GetPropertyDefinitionsByEntityClassId("FILE");
- // использование LINQ для запроса массива
- IEnumerable<PropDef> selection =
- from propDef in fileProps
- where propDef.DispName == "Пользовательское свойство"
- select propDef;
- if (selection.Count() == 0)
- throw new Exception("Свойство не найдено");
- PropDef fileNamePropDef = selection.First();
- Dim fileProps As PropDef() = propSvc.GetPropertyDefinitionsByEntityClassId("FILE")
- ' использование LINQ для запроса массива
- Dim selection As IEnumerable(Of PropDef) = _
- From propDef In fileProps _
- Where propDef.DispName = "Пользовательское свойство" _
- Select propDef
- If selection.Count() = 0 Then
- Throw New Exception("Свойство не найдено")
- End If
- Dim fileNamePropDef As PropDef = selection.First()
Давайте теперь преобразуем массив файлов в массив ID.
- File [] files = docSvc.GetLatestFilesByFolderId(root.Id, true);
- // использование LINQ для получения значений ID
- IEnumerable<long> ids =
- from file in files
- select file.Id;
- long[] fileIdArray = ids.ToArray();
- Dim files As File() = docSvc.GetLatestFilesByFolderId(root.Id, True)
- ' использование LINQ для получения значений ID
- Dim ids As IEnumerable(Of Long) = _
- From file In files _
- Select file.Id
- Dim fileIdArray As Long() = ids.ToArray()
Он также может сделать сортировку для вас.
- PropInst[] propValues = propSvc.GetProperties(
- "FILE", fileIdArray, new long[]{ fileNamePropDef.Id });
- // LINQ произведёт сортировку для вас
- IEnumerable<PropInst> sortedValues =
- from value in propValues
- orderby value.Val
- select value;
- PropInst[] values1 = sortedValues.ToArray();
- Dim propValues As PropInst() = _
- propSvc.GetProperties("FILE", fileIdArray, _
- New Long() {fileNamePropDef.Id})
- ' LINQ произведёт сортировку для вас
- Dim sortedValues As IEnumerable(Of PropInst) = _
- From value In propValues _
- Order By value.Val _
- Select value
- Dim values1 As PropInst() = sortedValues.ToArray()
Лямбда-выражения
Во многих случаях, вы можете уплотнить эти описания вещи дальше с помощью лямбда-выражений. Всё же это что-то вроде компромисса. Код менее читаемый, но вы получите чувство удовлетворения от "Я сделал все это в одну строчку".
Вот приведенные выше примеры C #, но в Lambda (VB.NET вряд ли поддерживает Lambda):
- // найти специфический элемент в массиве
- PropDef fileNamePropDef = fileProps.First(n => n.DispName == "My custom property");
- // преобрадовать в массив ID
- IEnumerable<long> ids = files.Select(n => n.Id);
- // сортировать массив
- IEnumerable<PropInst> sortedValues = propValues.OrderBy(n => n.Val);
Как и для любых особенностей программирования, есть широкое поле для злоупотреблений LINQ. Потому рекомендуется ознакомится с документацией MSDN на предмет того, как наилучшим образом использовать эти новые концепции. Например, стоит избегать ключевого слова "var".
Источник: http://justonesandzeros.typepad.com/blog/2010/06/linq-is-your-friend.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=655
Опубликовано 08.04.2014