У меня есть иерархическое дерево данных, содержащее объекты класса с именем DataNode
.
Каждый DataNode
содержит набор Attribute
объектов. Каждый Attribute
по сути представляет собой пару ключ/значение с некоторыми присоединенными вспомогательными методами. Например, есть вспомогательный метод EqualsCodeIndex(x)
, который сопоставляет небольшой набор x
значений int
с this
attribute
и возвращает true
или false
. Все ключи и значения являются строками, потому что все это основано на хранилище ключей/значений, содержащемся в текстовом файле.
Чтобы упростить доступ к конкретному DataNode
, в классе DataTree
есть словарь, который сопоставляет все узлы дерева с уникальным кодом:
Dictionary<string, DataNode> Codes;
Результирующий оператор Linq для получения определенного значения Attribute
выглядит следующим образом:
string AttributeValue = dataTree
.Codes[@"R-1\CHE"]
.Attributes
.Single(x => x.EqualsCodeIndex(parentAttribute.CodeIndex))
.Value.Trim();
Это не так уж плохо, если мне нужно получить только один или два атрибута по коду и индексу кода, но не так хорошо, если мне нужно получить десять или более.
Чтобы попытаться упростить оператор и разрешить возможность EqualsCodeIndex
возвращать false
для всех атрибутов в коллекции, я добавил метод расширения:
public static string AttributeValueMatching
(this KeyValuePair<string, DataNode> pair, List<int> codeIndex)
{
var attribute = pair.Value.Attributes
.Single(x => x.EqualsCodeIndex(codeIndex))
return attribute == null ? string.Empty : value;
}
Это упрощает исходный оператор linq до:
string attributeValue
= dataTree.Codes[@"R-1\CHE"].AttributeValueMatching(codeIndex);
... что лучше, но у меня такое чувство, что я что-то упускаю.
Есть ли проблемы с этим подходом? Есть ли лучший, более чистый подход, о котором я не думал, может быть, лучше использовать индексаторы или, возможно, свободный интерфейс?