ADN Open CIS
Сообщество программистов Autodesk в СНГ

08/04/2014

LINQ - хорошая вещь в работе с Autodesk Vault

Во время программирования под Vault, в конечном счете, вам приходится много работать с массивами. Оказывается, что вам постоянно необходимо перебирать массивы для того, чтобы найти один искомый объект. Либо массив объектов необходимо перевести в массив ID.

У .NET 3.0 есть хорошая особенность, LINQ, которая позволяет осуществлять эти операции значительно проще, чем создавать циклы foreach при каждом удобном случае. Это в основном, синтаксис запросов для коллекций .NET. Если вы фанат SQL, у вас не возникнет никаких проблем при работе с LINQ. Даже если вы незнакомы с SQL, с этим синтаксисом достаточно легко работать.

Допустим вы хотите найти специфическое определение свойства в массиве объектов PropDef.

Код - C#: [Выделить]
  1. PropDef [] fileProps = propSvc.GetPropertyDefinitionsByEntityClassId("FILE");
  2. // использование LINQ для запроса массива
  3. IEnumerable<PropDef> selection =
  4.    from propDef in fileProps
  5.    where propDef.DispName == "Пользовательское свойство"
  6.    select propDef;
  7. if (selection.Count() == 0)
  8.     throw new Exception("Свойство не найдено");
  9. PropDef fileNamePropDef = selection.First();

Код - VBA: [Выделить]
  1. Dim fileProps As PropDef() = propSvc.GetPropertyDefinitionsByEntityClassId("FILE")
  2. ' использование LINQ для запроса массива
  3. Dim selection As IEnumerable(Of PropDef) = _
  4.     From propDef In fileProps _
  5.       Where propDef.DispName = "Пользовательское свойство" _
  6.       Select propDef
  7. If selection.Count() = 0 Then
  8.       Throw New Exception("Свойство не найдено")
  9. End If
  10. Dim fileNamePropDef As PropDef = selection.First()

Давайте теперь преобразуем массив файлов в массив ID.

Код - C#: [Выделить]
  1. File [] files = docSvc.GetLatestFilesByFolderId(root.Id, true);
  2. // использование LINQ для получения значений ID
  3. IEnumerable<long> ids = 
  4.    from file in files 
  5.    select file.Id;
  6. long[] fileIdArray = ids.ToArray();

Код - VBA: [Выделить]
  1. Dim files As File() = docSvc.GetLatestFilesByFolderId(root.Id, True)
  2. ' использование LINQ для получения значений ID
  3. Dim ids As IEnumerable(Of Long) = _
  4.       From file In files _
  5.       Select file.Id
  6. Dim fileIdArray As Long() = ids.ToArray()

Он также может сделать сортировку для вас.

Код - C#: [Выделить]
  1. PropInst[] propValues = propSvc.GetProperties(
  2. "FILE", fileIdArray, new long[]{ fileNamePropDef.Id });
  3. // LINQ произведёт сортировку для вас
  4. IEnumerable<PropInst> sortedValues = 
  5.     from value in propValues 
  6.     orderby value.Val 
  7.     select value;
  8. PropInst[] values1 = sortedValues.ToArray();

Код - VBA: [Выделить]
  1. Dim propValues As PropInst() = _
  2.     propSvc.GetProperties("FILE", fileIdArray, _
  3.     New Long() {fileNamePropDef.Id})
  4. ' LINQ произведёт сортировку для вас
  5. Dim sortedValues As IEnumerable(Of PropInst) = _
  6.       From value In propValues _
  7.       Order By value.Val _
  8.       Select value
  9. Dim values1 As PropInst() = sortedValues.ToArray()

Лямбда-выражения

Во многих случаях, вы можете уплотнить эти описания вещи дальше с помощью лямбда-выражений. Всё же это что-то вроде компромисса. Код менее читаемый, но вы получите чувство удовлетворения от "Я сделал все это в одну строчку".

Вот приведенные выше примеры C #, но в Lambda (VB.NET вряд ли поддерживает Lambda):

Код - C#: [Выделить]
  1. // найти специфический элемент в массиве
  2. PropDef fileNamePropDef = fileProps.First(n => n.DispName == "My custom property");
  3. // преобрадовать в массив ID
  4. IEnumerable<long> ids = files.Select(n => n.Id);
  5. // сортировать массив
  6. 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