2011-12-12 23 views

回答

6

我可能會使用的Any它接受一個謂詞過載:

private bool TermExists(string word) 
{ 
    return m_xdoc.Descendants("Term") 
     .Any(term => term.Attribute("Name").Value 
         .IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0); 
} 

注:

  • 使用ToUpper爲不區分大小寫一般充滿(例如,由於行爲土耳其人對大多數開發商來說是意想不到的)使用overload of IndexOf which takes a StringComparison是首選。 (有用於Equals類似的過載。)
  • 如果我們要與word.ToUpper()比較,我們可以每Term元素提取出來,這樣word.ToUpper()只執行一次,而不是一次。 (微觀優化,我認爲首先提取查詢的迭代不變部分通常是一個好主意,但不要指望這個前沿的一致性:)
  • 此代碼仍然會爲Term元素爆炸而沒有Name屬性。這可能是也可能不是你想要的。
+0

在.NET中正確使用不區分大小寫的'string.Contains'的最簡單方法是使用'IndexOf' - 查看我的答案。 – mquander

+0

我剛剛看到他們,所以我刪除了我的問題:o) –

+0

@mquander:謝謝,相應地修復。 –

1

如果你想返回第一個匹配項,而不是怎麼樣,如果沒有找到或者返回的項目或null的方法:

private XElement? GetTerm(string word) 
{ 
     var query = from term in m_xdoc.Descendants("Term") 
        where term.Attribute("Name").Value.ToUpper().Contains(word.ToUpper()) 
        select term; 

     return query.FirstOrDefault(); 
} 
1

我可能會這樣寫:

private static bool MatchesName(XElement el, string name) 
{ 
    var attr = el.Attribute("Name"); 
    return attr.Value.IndexOf(name, StringComparison.OrdinalIgnoreCase) >= 0; 
} 

private bool TermExists(string word) 
{ 
    return m_xdoc.Descendants("Term").Any(e => MatchesName(e, word)); 
} 

雖然沒有看到其他代碼,但很難說分拆幫助器的方法。

相關問題