我有一個分層數據樹,它包含一個名爲DataNode
的類的對象。如何提高這些linq語句的可讀性?
每個DataNode
包含一個Attribute
對象的集合。每個Attribute
本質上是一個鍵/值對,並附有一些輔助方法。例如,有一種稱爲EqualsCodeIndex(x)
的幫助方法,其與值的小集合x
匹配到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();
這是不是太糟糕,如果我只需要通過檢索代碼和代碼索引的一個或兩個屬性,但它不是那麼好,如果我個人有T ο檢索十個或更多。
爲了嘗試簡化聲明,並允許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);
......這是更好的,但我有一種感覺,我失去了一些東西。
這種方法有問題嗎?有沒有更好,更清潔的方法我沒有想到,也許更好地使用索引器,或者一個流暢的接口?
是不是跟着'.SingleOrDefault'跟'.Value'請求一個NRE? – 2011-06-09 20:41:15
@Kirk:通過擴展方法封裝的更好理由。我已經解決了示例代碼中的問題,雖然最終結果看起來不像這樣。 – 2011-06-09 20:42:13
你是什麼意思檢索二十或三十?創建20個新的不同變量? – svick 2011-06-09 20:49:45